2016 ICPC EC-Final 上海
阿新 • • 發佈:2018-12-14
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;
}