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