2016 ICPC EC-Final 上海

A:Number Theory Problem

题意:

求比2^N小的,敲好等于(2^k)-1的同时是7的倍数的个数

分析:

暴力打表找出规律

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int main()
{
    
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        ans=0;   flag=1;
        printf("Case #%d: %d\n",cas++,n/3);
    }
    return 0;
}

 D:Ice Cream Tower

题意:

n个冰淇淋球,每k个冰淇淋球可以做成一个冰淇淋。 这K个球还必须满足上下相邻的下面比上面大至少两倍

求n个球的能做成多少个冰淇淋

分析:

二分查找答案+贪心

代码:

#include <bits/stdc++.h>
using namespace std;
int cas,T,n,k,top[100],s;
long long a[300010];
int ok(int num)
{
    int no=1,f=0;
    for(int i=1;i<=num;i++)
        top[i]=a[i];
    s=num+1;
    while(1)
    {
        f=0;
        for(int i=1;i<=num;i++)
        {
            while(a[s]<top[i]*2&&s<=n)
            {
                s++;
            }
            top[i]=a[s];
            s++;f++;
            if(s>n) break;
        }
        if(f==num) no++;
        if(no>=k) return 1;
        if(n-s+1<(k-no)*num) return 0;
    }
    return 0;
}
int main()
{
    scanf("%d",&T);
   while(T--)
   {
       scanf("%d%d",&n,&k);
       cas++;
       for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
       sort(a+1,a+1+n);
       int l=0,r=n/k+1,mid=-1;
       while(1)
       {
           if(mid==(l+r)/2) break;
           mid=(l+r)/2;
           if(ok(mid)) l=mid;
           else r=mid;
       }
       printf("Case #%d: %d\n",cas,l);

   }
}

 E:Bet

题意:

选择m个队伍,保证无论是哪一个赢都能赚钱,(只能有一个队伍赢),输出可以选择的最多的队伍数量

分析:

简单的贪心,但是要考虑精度问题,要用long double

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=210;
const long double dou=1;
int n,m,k;
long double a[maxn],b[maxn];
int ans,flag;
int main()
{
    int T,cas=1;
    long double x,y;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        ans=0;flag=1;
        for(int i=0;i<n;i++)
        {
        scanf(" %Lf:%Lf",&x,&y);
        a[i]=1.0000+(y/x);
        b[i]=dou*1.0/(a[i]);
        }
        sort(b,b+n);
        long double sum=0;
        for(int i=0;i<n&&sum<dou;i++)
        {
            sum+=b[i];
            if(sum<dou)ans++;
        }
        printf("Case #%d: %d\n",cas++,ans);
    }
    return 0;
}

 L:World Cup

题意:

四支队伍打比赛,每两支队伍都要打一场,一共打6场,赢得得3分输的不得分,平局两支队伍各得一分,给你最后的得分情况,判断是否存在,如果存在一种情况输出Yes,如果存在多种输出No,否则Wrong Scoreboard

分析:

我们暴力深搜的,反正数据小,不会超时

代码;

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],c[maxn];
int ans,flag;
void jud()
{
    for(int i=1;i<=4;i++)
    if(a[i]!=c[i]) return;
    flag++;
    return ;
}
void dfs(int x)
{
    if(x==7) {jud();return;}
    if(x==1)
    {
        c[1]+=3;
        dfs(x+1);
        c[1]-=3;
        c[2]+=3;
        dfs(x+1);
        c[2]-=3;
        c[2]+=1;
        c[1]+=1;
        dfs(x+1);
        c[2]-=1;
        c[1]-=1;
    }
    if(x==2)
    {
        c[1]+=3;
        dfs(x+1);
        c[1]-=3;
        c[3]+=3;
        dfs(x+1);
        c[3]-=3;
        c[3]+=1;
        c[1]+=1;
        dfs(x+1);
        c[3]-=1;
        c[1]-=1;
    }
    if(x==3)
    {
        c[1]+=3;
        dfs(x+1);
        c[1]-=3;
        c[4]+=3;
        dfs(x+1);
        c[4]-=3;
        c[4]+=1;
        c[1]+=1;
        dfs(x+1);
        c[4]-=1;
        c[1]-=1;
    }
    if(x==4)
    {
        c[3]+=3;
        dfs(x+1);
        c[3]-=3;
        c[2]+=3;
        dfs(x+1);
        c[2]-=3;
        c[2]+=1;
        c[3]+=1;
        dfs(x+1);
        c[2]-=1;
        c[3]-=1;
    }
    if(x==5)
    {
        c[4]+=3;
        dfs(x+1);
        c[4]-=3;
        c[2]+=3;
        dfs(x+1);
        c[2]-=3;
        c[2]+=1;
        c[4]+=1;
        dfs(x+1);
        c[2]-=1;
        c[4]-=1;
    }
    if(x==6)
    {
        c[3]+=3;
        dfs(x+1);
        c[3]-=3;
        c[4]+=3;
        dfs(x+1);
        c[4]-=3;
        c[4]+=1;
        c[3]+=1;
        dfs(x+1);
        c[4]-=1;
        c[3]-=1;
    }
}
int main()
{

    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        ans=0;flag=1;
        for(int i=1;i<=4;i++)
        {
        scanf("%d",&a[i]);
        }
        flag=0;
        for(int i=0;i<5;i++)
        c[i]=0;
        dfs(1);
        if(flag==0)
        {
            printf("Case #%d: Wrong Scoreboard\n",cas++);
            continue;
        }
        else if(flag!=1)
        {
            printf("Case #%d: No\n",cas++);
            continue;
        }
        else printf("Case #%d: Yes\n",cas++);
      //  if(flag) puts("Yes"); else puts("No");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lml11111/article/details/82958124