• noip2016 普及组


    T1 买铅笔 题目传送门

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,x,y,ans=inf;
    int main()
    {
        int now,nowf;
        n=read();
        for(int i=1;i<=3;i++){
            x=read(); y=read();
            if(n%x) now=n/x+1;
            else now=n/x;
            nowf=now*y;
            ans=min(ans,nowf);
        }
        printf("%d
    ",ans);
        return 0;
    }
    View Code

    T2 回文日期 题目传送门

    这道题其实枚举一波年份再判就好了 当时傻逼了就直接枚举了 mdzz 

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=51848250;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n;
    int f[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
    int nx,ny,nz,tail=1,ans;
    struct node{int x,y,z;}q[M];
    int pd(int x){
        if(x%4) return 0;
        if(x%100==0){
            if(x%400==0) return 1;
            return 0;
        }
        return 1;
    }
    int check(int x){
        int sx=q[x].x,sy=q[x].y,sz=q[x].z; //printf("%04d%02d%02d
    ",sx,sy,sz);
        return (sx!=nx||sy!=ny||sz!=nz);
    }
    void add(int k){
        int x=q[k].x,y=q[k].y,z=q[k].z+1;    
        int now=pd(x);
        if(f[now][y]<z) z=1,y++;
        if(y>12) y=1,x++;
        tail++;
        q[tail].x=x; q[tail].y=y; q[tail].z=z;
    }
    int okay(int x){
        int ans=q[x].x*10000+q[x].y*100+q[x].z; //printf("%d
    ",ans);
        int s[10];
        for(int i=1;i<=8;i++) s[i]=ans%10,ans=ans/10;
        return s[1]==s[8]&&s[2]==s[7]&&s[3]==s[6]&&s[4]==s[5];
    }
    int main()
    {
        n=read(); q[tail].x=n/10000; q[tail].y=n/100%100; q[tail].z=n%100;
        //printf("[%d %d %d]
    ",q[1].x,q[1].y,q[1].z);
        n=read(); nx=n/10000; ny=n/100%100; nz=n%100;
        if(okay(tail)) ans++;
        while(check(tail)){
            add(tail);
            if(okay(tail)) ans++;
        }
        printf("%d
    ",ans);
        return 0;
    }
    View Code

    T3 海港 题目传送门

    这道题搞了个队列记一波就okay了 代码简洁

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=100007,mx=86400;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int sum[M];
    struct node{int t,w;}q[3*M];
    int head,tail,n,last,k,x,tot;
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++){
            last=read(); k=read();
            for(int i=1;i<=k;i++){
                x=read(); 
                if(!sum[x]) tot++;
                sum[x]++;
                q[tail].t=last; q[tail++].w=x;
            }
            while(q[head].t+mx<=last&&head<tail){
                int now=q[head++].w; 
                sum[now]--;
                if(!sum[now]) tot--;
            }
            printf("%d
    ",tot);
        }
        return 0;
    }
    View Code

    T4 魔法正 题目传送门

    这道题 还是有点复杂了 自己没写出来 看了波题解开着

    首先由题目可得 设c-d差距为i 则a-b距离是2i b-c距离要大于6i 这样我们外层枚举i内层枚举d就可以解决问题了

    当然由于a,b可以由c,d推过来但是满足情况的c,d太多了所以要从边界模拟过来使得所有被枚举的c,d都合法 把这些合法的状态都累加起来算就比较方便 降一波复杂度

    同理c,d

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=45007,maxN=15007;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int sum,xa,xb,xc,xd;
    int n,m,id[M],w[maxN];
    int a[maxN],b[maxN],c[maxN],d[maxN];
    int main()
    {
        n=read(); m=read();
        for(int i=1;i<=m;i++) id[i]=read(),w[id[i]]++;
        for(int i=1;i<=n/9;i++){
            int now=i*9;
            sum=0;
            for(xa=n-now-1;xa;xa--){
                xb=xa+2*i; xc=xb+6*i+1; xd=xc+i;
                sum+=w[xc]*w[xd];
                a[xa]+=w[xb]*sum;
                b[xb]+=w[xa]*sum;
            }
            sum=0;
            for(xd=now+1;xd<=n;xd++){
                xc=xd-i; xb=xc-6*i-1; xa=xb-2*i;
                sum+=w[xa]*w[xb];
                c[xc]+=sum*w[xd];
                d[xd]+=sum*w[xc];
            }
        }
        for(int i=1;i<=m;i++) printf("%d %d %d %d
    ",a[id[i]],b[id[i]],c[id[i]],d[id[i]]);
        return 0;
    }
    View Code
  • 相关阅读:
    前端利用vueelementadmin搭建流程总结
    redis持久化机制
    Java常用阻塞队列
    垃圾回收之并发情况下如何确定对象可达
    手写LRU算法
    SynchronousQueue详解
    (mysql)存储引擎、索引及优化、事务与锁
    (多线程)synchronized同步对象不能是Integer等类型
    (@Validated)参数合法性校验框架 的常用注解
    (Sql Server)分页
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7123179.html
Copyright © 2020-2023  润新知