2016EC-Final

来源:互联网 发布:软件设计师证书有效期 编辑:程序博客网 时间:2024/06/08 17:45

A - Number Theory Problem

  • 题意:给数N,从1到2^N的可以写成2^k-1,且能被7整除的数的个数
  • 题解:枚举一下发现规律,n每3个就有一个可以被7整除
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){    int caset,n,t = 1;    scanf("%d",&caset);    while(caset--)    {        scanf("%d",&n);        printf("Case #%d: %d\n",t++,n/3);    }    return 0;}

D - Ice Cream Tower

  • 题意:n个冰淇淋球,每k个冰淇淋球可以做成一个冰淇淋。
    • 并且由于稳定性,这K个球还必须满足上下相邻的下面比上面大至少两倍
    • 先给出n个球的质量问能做成多少个冰淇淋
  • 题解:n个冰淇淋球,每k个可以作为一个冰淇淋,最多可以做成n/k个
    • 要判断最多能做多少个,我们可以二分答案 n/k;
    • 然后要判断能否做成 m 个冰淇淋 , 对 m 进行检验:
    • 检验标准是:首先对B[]排序后将前m个取出来作为m个冰淇淋的顶端,
      • 也就是A[]的前m个=B[]的前m个,之后选A[i]时,贪心地去找满足B[p]>2×A[i-m]的B[p]作为A[i],
      • 这样p最多就只跑一遍(线性),如果能构成表示检验返回结果成功,反之返回结果失败。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 3e5+10;int b[maxn],a[maxn];int n,k;bool check(int mid){    for(int i=0;i<mid;i++) a[i] = b[i];    int pos = mid;    for(int i=mid;i<mid*k;i++)    {        while(b[pos]<a[i-mid]*2 && pos < n) pos++;        if(pos == n) return false;        a[i] = b[pos++];    }    return true;}int main(){    int caset,t = 1;    scanf("%d",&caset);    while(caset--)    {        scanf("%d%d",&n,&k);        for(int i=0;i<n;i++) scanf("%d",&b[i]);        sort(b,b+n);        int l = 0,r = n/k,ans = 0;        while(l <= r)        {            int mid = (r + l) >> 1;            if(check(mid)) ans = mid,l = mid+1;            else r = mid - 1;        }        printf("Case #%d: %d\n",t++,ans);    }    return 0;}

L - World Cup

  • 题意:就是有4个人在一个组,每两个人要进行一场比赛总共六场比赛
    • 每一次比赛有赢的一方加3分,输的一方不加分,如果平局都加上1分。
    • 给你4个人的最终的得分,问你得分是否唯一,唯一 Yes,不唯一 No,如果不可能有这样的比赛 Wrong Scoreboard;
  • 题解:由于总共6场比赛,每场比赛总共3种情况,就3^6种情况
    • 利用递归打出所有情况的表。
    • 注意输入的4个数要先判断是否合法。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int dir[6][2] = {1,2,1,3,1,4,2,3,2,4,3,4};const int win[3][2] = {3,0,0,3,1,1};const int mul[5] = {0,1000,100,10,1};const int maxn = 1e5+10;int vis[maxn];int inp[4];void init(int pos,int sum){    if(pos == 6){        vis[sum]++;        return;    }    int temp;    for(int i=0;i<3;i++){        temp = sum;        temp += win[i][0]*mul[dir[pos][0]];        temp += win[i][1]*mul[dir[pos][1]];        init(pos+1,temp);    }}int main(){    init(0,0);    int caset,t = 1;    scanf("%d",&caset);    while(caset--)    {        bool flag = true;        for(int i=0;i<4;i++){            scanf("%d",&inp[i]);            if(inp[i] < 0 || inp[i] > 9) flag = false;        }        printf("Case #%d: ",t++);        if(flag)        {            int sum = 0;            for(int i=0;i<4;i++) sum+=inp[i]*mul[i+1];            if(!vis[sum]) printf("Wrong Scoreboard\n");            else if(vis[sum] == 1) printf("Yes\n");            else printf("No\n");        }        else printf("Wrong Scoreboard\n");    }}
原创粉丝点击