1. 程式人生 > >2016 ICPC EC-Final 上海

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