• Codeforces Round #461 (Div. 2)


    A - Cloning Toys

    /*
        题目大意:给出两种机器,一种能将一种原件copy出额外一种原件和一个附件,
        另一种可以把一种附件copy出额外两种附件,给你一个原件,
        问能否恰好变出题目要求数量的原件和附件
        题解:注意当附件需求不为0的时候,原件需求必须大于1
    */
    #include <cstdio>
    #include <algorithm>
    int main(){
    	int a,b; 
        scanf("%d%d",&a,&b);
        if((a-b+1)%2==0&&a-b+1>=0&&b>1||(a==0&&b==1))puts("Yes");
        else puts("No");
        return 0;
    } 

    B - Magic Forest

    /*
        题目大意:求n以内的三个数字使得其异或和为0且能构成三角形的三边
    */
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n,ans=0;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                int k=i^j;
                if(k<i+j&&k>j&&k<=n)ans++;
            }
        }printf("%d
    ",ans);
        return 0;
    }

    C - Cave Painting

    /*
        题目大意:问是否n对1-k的数取模答案均不相同
        题解:要达到题目要求,我们发现有n%i=i-1,即(n+1)%i=0
    */
    #include <cstdio>
    #include <cstring>
    using namespace std;
    long long n,k; 
    int main(){
        scanf("%lld%lld",&n,&k);
        for(long long i=1;i<=k;i++){
            if((n+1)%i){puts("No");return 0;}
        }puts("Yes");
        return 0;
    }

    D - Robot Vacuum Cleaner

    /*
        题目大意:给出一些s和h组成的串,求将其拼合在一起能组成的最多的sh序列
        题解:我们发现拼接顺序的变化只对相邻两个串的答案有影响,所以我们根据这点排序,
        然后顺序统计即可
    */
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N=100010;
    struct data{long long s,h;}p[N];
    bool cmp(data a,data b){
        return a.s*b.h>a.h*b.s;
    }
    char s[N];
    int n;
    long long ans=0;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            p[i].s=0; p[i].h=0;
            scanf("%s",s);
            int len=strlen(s);
            for(int j=0;j<len;j++){
                if(s[j]=='s')p[i].s++;
                if(s[j]=='h'){ans+=p[i].s;p[i].h++;}
            }
        }sort(p+1,p+n+1,cmp);
        long long S=0;
        for(int i=1;i<=n;i++){
            ans+=S*p[i].h;
            S+=p[i].s; 
        }printf("%lld
    ",ans);
        return 0;
    }

    E - Birds

    /*
        题目大意:每棵树召唤鸟的代价都是不同的,每棵树上最多有c只鸟,
        每当召唤一只鸟魔法上限会提升,每走到下一棵树魔法会回复X,但是最多不能超过上限,
        不能往回走,问最多能召唤几只鸟
        题解:dp[i][j]表示到达第i棵树一共召唤了j只鸟剩余的mana值,
        只要大于等于0即表示该状态可达,用背包问题求解dp即可
    */
    #include <cstdio>
    #include <algorithm>
    #include <cstring> 
    using namespace std;
    typedef long long LL;
    LL dp[1010][10010],W,B,X,C=0;
    int n,cost[1010],c[1010];
    int main(){
        memset(dp,0x80,sizeof(dp));
        scanf("%d%lld%lld%lld",&n,&W,&B,&X);
        dp[0][0]=W;
        for(int i=1;i<=n;i++)scanf("%d",&c[i]),C+=c[i];
        for(int i=1;i<=n;i++)scanf("%d",&cost[i]);
        for(int i=1;i<=n;i++){
            for(int j=0;j<=C;j++){
                LL nw=dp[i-1][j];
                if(nw<0)continue;
                for(LL k=0;k<=c[i]&&k*cost[i]<=nw;k++)dp[i][j+k]=max(dp[i][j+k],nw-k*cost[i]);
            }
            for(int j=0;j<=C;j++)dp[i][j]=min(dp[i][j]+X,B*j+W);
        }
        for(int i=C;i>=0;i--)if(dp[n][i]>=0){
            printf("%d
    ",i);
            return 0;
        }
    }

    F - Divisibility

    /*
        题目大意:给出n和k,要求找出数字大小在n以内的非重集合,使得集合中存在恰好k对a和b,
        满足a能整除b
        题解:我们先用nlogn的时间预处理出每个数被其小的数整除的次数di,
        我们可以通过均摊logn的单次复杂度计算出一个数被比其大的数整除的次数,
        那么我们就能比较快地得到一个数对于答案的影响
        我们先随意去除一些di大于1的数,然后用较小的碎块去凑k这个整数,
        如果无法凑出来,则不可行
    */
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int N=300010;
    int n,k,d[N],b[N],tot=0,ans=0;
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
            b[i]=1; for(int j=i+i;j<=n;j+=i)d[j]++,tot++;
        }
        for(int i=n;i>1;i--){
            int s=d[i];
            for(int j=i+i;j<=n;j+=i)if(b[j])s++;
            if(tot-s>=k&&d[i]>1){
                tot-=s;
                b[i]=0; for(int j=i+i;j<=n;j+=i)d[j]--;
            }
        }
        for(int i=n;i>=1;i--){
            int s=d[i];
            for(int j=i+i;j<=n;j+=i)if(b[j])s++;
            if(tot-s>=k&&b[i]){
                tot-=s;
                b[i]=0; for(int j=i+i;j<=n;j+=i)d[j]--;
            }
        }
        for(int i=1;i<=n;i++)ans+=b[i];
        if(tot!=k){puts("No");return 0;}
        puts("Yes");
        printf("%d
    ",ans);
        for(int i=1;i<=n;i++)if(b[i])printf("%d ",i);
        return 0;
    }
  • 相关阅读:
    中国移动校园WLAN客户端及使用方法
    Win7 开启upnp服务,直接在网络中设置连接路由设备
    转载:迷你云 – 搭建自己的本地多人团队Dropbox 服务
    JLINK V8固件烧录指导
    实验室网站试运营期间的信息管理
    并非如你想象的那般强大,带你重新认识3D打印
    转:技术宅逆天了!如何从按键音中听出周鸿祎的手机号码
    南大学生破译周鸿祎电话获得互联网大佬青睐
    E430 加装固态硬盘(SSD)参考
    iptables_cacti_nagios
  • 原文地址:https://www.cnblogs.com/forever97/p/codeforces461.html
Copyright © 2020-2023  润新知