10.20考试爆炸记

嗯继续爆炸,什么都不如爆炸,用这个方式相处,没有人觉得孤独
(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
nm 的范围内圈 k 个子矩阵的最大权值和, m12

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;       
}

你可能感兴趣的:(OI,琐题集萃门,动态规划纲,数据结构门)