嗯继续爆炸,什么都不如爆炸,用这个方式相处,没有人觉得孤独
(1)rock
已知n张刮刮卡按顺序排列,刮开可以获得B元现金和B个积分,购买刮刮卡需要A元,某人按照顺序刮开,当B的总和小于A时便会停止刮卡(即花出去的钱多余赢得的钱),现在我们可以将前k张按原来的顺序接在第n张后
求k取多少时这个人可以获得最多积分,若有多k输出最小的那个
扫一遍
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline int read(){
int i=0,f=1;
char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())
if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar())
i=(i<<3)+(i<<1)+(ch^48);
return i*f;
}
int buf[1024];
inline void write(int x){
if(!x){putchar('0');return ;}
if(x<0){putchar('-');x=-x;}
while(x){buf[++buf[0]]=x%10,x/=10;}
while(buf[0]) putchar(buf[buf[0]--]+48);
return ;
}
#define stan 2222222
int n,a[stan],b[stan],tmpans,ans,pos,sta,tot;
signed main(){
n=read();
for(int i=1;i<=n;++i)
b[n+i]=b[i]=read();
for(int i=1;i<=n;++i)
a[n+i]=a[i]=(b[i]-read());
tot=0;sta=1;
for(int i=1;i<=2*n;++i){
if(tot<0){
if(tmpans>ans){
ans=tmpans;
pos=sta;
}
sta=i;
tot=a[i];
tmpans=b[i];
}else{
tot+=a[i];
tmpans+=b[i];
if(i-sta==n-1){
write(sta-1);
return 0;
}
}
}
write(pos-1);
return 0;
}
(2)matrix
求 n∗m 的范围内圈 k 个子矩阵的最大权值和, m为1或2
m=1 :简单DP一下就可以
m=2 :五个数表示一下状态就可以
出于我最后的善意标注一下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline int read(){
int i=0,f=1;
char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())
if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar())
i=(i<<3)+(i<<1)+(ch^48);
return i*f;
}
int buf[1024];
inline void write(int x){
if(!x){putchar('0');return ;}
if(x<0){putchar('-');x=-x;}
while(x) buf[++buf[0]]=x%10,x/=10;
while(buf[0]) putchar(buf[buf[0]--]+48);
return ;
}
#define stan 111
int n,m,k,amte[stan][stan],ansi,f[stan][stan][stan],a[stan];
signed main(){
n=read();m=read();k=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
amte[i][j]=read();
memset(f,-10,sizeof(f));
if(m==1){
for(int i=1;i<=n;++i)
amte[i][1]+=amte[i-1][1];
for(int i=0;i<=n;++i)
f[i][0][0]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=k;++j){
f[i][j][0]=f[i-1][j][0];
for(int t=0;t0]=max(f[i][j][0],f[t][j-1][0]+amte[i][1]-amte[t][1]);
}
write(f[n][k][0]);
return 0;
}else{
ansi=-999999999;
f[0][0][0]=0;
for(int i=1;i<=n;++i){
f[i][0][0]=0;
for(int j=1;j<=k;++j){
f[i][j][0]=max(f[i-1][j][0],max(f[i-1][j][1],max(f[i-1][j][2],max(f[i-1][j][3],f[i-1][j][4]))));
f[i][j][1]=amte[i][1]+max(f[i-1][j-1][0],max(f[i-1][j-1][1],max(f[i-1][j-1][2],max(f[i-1][j-1][3],f[i-1][j-1][4]))));
f[i][j][1]=max(f[i][j][1],amte[i][1]+max(f[i-1][j][1],f[i-1][j][3]));
f[i][j][2]=amte[i][2]+max(f[i-1][j-1][0],max(f[i-1][j-1][1],max(f[i-1][j-1][2],max(f[i-1][j-1][3],f[i-1][j-1][4]))));
f[i][j][2]=max(f[i][j][2],amte[i][2]+max(f[i-1][j][2],f[i-1][j][3]));
if(j>=2)f[i][j][3]=amte[i][1]+amte[i][2]+max(f[i-1][j-2][0],max(f[i-1][j-2][1],max(f[i-1][j-2][2],max(f[i-1][j-2][3],f[i-1][j-2][4]))));
f[i][j][3]=max(f[i][j][3],amte[i][1]+amte[i][2]+max(max(f[i-1][j-1][1],f[i-1][j-1][2]),f[i-1][j-1][3]));
f[i][j][3]=max(f[i][j][3],amte[i][1]+amte[i][2]+f[i-1][j][3]);
f[i][j][4]=amte[i][1]+amte[i][2]+max(f[i-1][j-1][0],max(f[i-1][j-1][1],max(f[i-1][j-1][2],max(f[i-1][j-1][4],f[i-1][j-1][3]))));
f[i][j][4]=max(f[i][j][4],amte[i][1]+amte[i][2]+f[i-1][j][4]);
}
}
for(int i=1;i<=n;++i)
for(int l=0;l<=4;++l)
ansi=max(ansi,f[i][k][l]);
write(ansi);
}
return 0;
}
(3)table
对于一个 n 行 m 列的表格,进行 q 次操作
每次操作交换最多只有一个公共顶点的子矩阵
最后只输出一次
其实暴力可过
其实wuvin大佬的四向链表 O(n) 修改还是很6的
暴力版
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline int read(){
int i=0,f=1;
char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())
if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar())
i=(i<<3)+(i<<1)+(ch^48);
return i*f;
}
int buf[1024];
inline void write(int x){
if(!x){putchar('0');return ;}
if(x<0){putchar('-');x=-x;}
while(x){buf[++buf[0]]=x%10,x/=10;}
while(buf[0]) putchar(buf[buf[0]--]+48);
return ;
}
#define stan 1111
int n,m,q,mat[stan][stan],tag,r1,r2,c1,c2,h,w;
signed main(){
n=read();m=read();q=read();
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j){
mat[i][j]=read();
if(mat[i][j]!=1) tag=true;
}
if(!tag){
for(register int i=1;i<=q;++i)
for(register int j=1;j<=6;++j)
tag=read();
for(register int i=1;i<=n;++i){
for(register int j=1;j<=m;++j)
write(mat[i][j]),putchar(' ');
puts("");
}
return 0;
}else{
for(register int i=1;i<=q;++i){
r1=read();c1=read();
r2=read();c2=read();
h=read();w=read();
for(int j=0;jfor(int k=0;kfor(register int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
write(mat[i][j]),putchar(' ');
puts("");
}
return 0;
}
}
链表版
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline int read(){
int i=0,f=1;
char ch;
for(ch=getchar();!isdigit(ch);ch=getchar())
if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar())
i=(i<<3)+(i<<1)+(ch^48);
return i*f;
}
int buf[1024];
inline void write(int x){
if(!x){putchar('0');return ;}
if(x<0){putchar('-');x=-x;}
while(x){buf[++buf[0]]=x%10,x/=10;}
while(buf[0]) putchar(buf[buf[0]--]+48);
return ;
}
#define stan 1111
#define sten 2222222
int n,m,q,block[stan][stan],down[sten],righ[sten],val[sten],tot;
int locate(int a,int b){
int tmpos=block[0][0];
for(register int i=1;i<=a;++i)
tmpos=down[tmpos];
for(register int i=1;i<=b;++i)
tmpos=righ[tmpos];
return tmpos;
}
signed main(){
n=read();m=read();q=read();
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
val[block[i][j]=++tot]=read();
for(register int i=0;i<=m+1;++i)
block[0][i]=++tot,block[n+1][i]=++tot;
for(register int i=1;i<=n;++i)
block[i][0]=++tot,block[i][m+1]=tot;
for(register int i=0;i<=n;++i)
for(register int j=0;j<=m;++j){
righ[block[i][j]]=block[i][j+1];
down[block[i][j]]=block[i+1][j];
}
while(q--){
int r1=read(),c1=read(),r2=read(),c2=read(),h=read(),w=read();
register int loc1=locate(r1-1,c1-1),loc2=locate(r2-1,c2-1),t1,t2,j;
for(t1=loc1,t2=loc2,j=1;j<=h;++j)
swap(righ[t1=down[t1]],righ[t2=down[t2]]);
for(j=1;j<=w;++j)
swap(down[t1=righ[t1]],down[t2=righ[t2]]);
for(t1=loc1,t2=loc2,j=1;j<=w;++j)
swap(down[t1=righ[t1]],down[t2=righ[t2]]);
for(j=1;j<=h;++j)
swap(righ[t1=down[t1]],righ[t2=down[t2]]);
}
int pos=block[0][0];
for(register int i=1;i<=n;++i){
pos=down[pos];
for(register int j=1,tmpos=pos;j<=m;++j)
write(val[tmpos=righ[tmpos]]),putchar(' ');
puts("");
}
return 0;
}