Codeforces Round #492 (Div.2 Only)
Posted absi2011
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #492 (Div.2 Only)相关的知识,希望对你有一定的参考价值。
似乎这一场ABCDE都是阅读理解题.....
F最后fst了,一个自己的小bug....难受
传送门:http://codeforces.com/contest/991
A题
直译:
在一个神奇的科目..你挂科了...
有A个过了的大佬在"Bug当劳"餐厅庆祝
B个大佬在"Beaver王"餐厅庆祝
其中有C个大佬在两个地方都庆祝了
一共班上有N个人
给你ABCN问你是否合法
(PS:你挂科了,所以挂科人数至少为1)
如果合法,输出有几个挂科的人
做法:
A<=C
B<=C
N-(A+B-C)>=1
都满足就输出N-(A+B-C)
否则输出-1
B题
你现在有n个工作,第i个工作拿了ai分(2~5以内的整数)
你现在可以调整某些分数到5
问最少调整几个,能让你的平均分在四舍五入以后得到5
做法:
sort,然后从低往高排序
C题
两个人在分糖吃
第一个人每次会吃k个,不足全吃了
第二个人每次会吃剩下的1/10,下取整
两个人轮流吃,第一个人先
给你糖的总数n(n<=1018),问最小的k使得第一个人能吃至少一半的糖
做法:
二分k
然后判断就暴力判断,因为每次减少1/10所以很快就能减到底
D题
给你一个2*n的格子
0表示可以放东西,X表示不可以
问最多能放几个L型的东西(可以旋转L)
L型的东西具体如下:
做法:
直接dp..
dp(i,j)表示到第i行,上一行有j个空位(j=0,1,2)
转移方程
dp(i,0) = max{dp(i-1,0),dp(i-1,1),dp(i-1,2)}
dp(i,1) = max{dp(i-1,0),dp(i-1,1),dp(i-1,2)+1}
dp(i,2) = max{dp(i-1,0),dp(i-1,1)+1,dp(i-1,2)+1}
E题
你今天上了一辆车,你看到车号是n
但是你可能昨天赌球输了(大雾)
你今天看到的数字可能编号顺序会交换,或者把一个数字看了多次
比如
12你可能看成112,21,221,12121212,111222121221等
问你上的车编号到底可能是啥
编号不可能有前导0,n也没有
数据范围n<=1018
做法:
把数字排序一下,然后枚举这个数用几个,用组合数计算一下
再减掉首位是0的
C(n,x0)*C(n-x0,x1)*C(n-x0-x1,x2)*...*C(n-x0-...x8,x9)
F题
给你一个数n
问你可以最少用几个字符表示
只能用+,*,^和数字
不允许连续^(也就是说2^3^4是不合法的)
不允许括号
做法:
我们考虑,一共有可能有什么情况
a+b?
a*b?似乎只会位数变多,不如n本身
只有a^b有用
那么a^b可能会节省很多位,那么就有下面的情况
a^b+c
a^b*c
a^b*c+d
a^b+c^d
a^b+c^d*e
a^b+c^d+e
差不多就这些情况吧.....
然后写一下就行...
代码:
A
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int a,b,c,n; scanf("%d%d%d%d",&a,&b,&c,&n); int ans=n-(a+b-c); if ((ans<=0)||(b<c)||(a<c)||(a>n)||(b>n)||(c>n)) { puts("-1"); } else { printf("%d ",ans); } return 0; }
B
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; int a[105]; int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int n; scanf("%d",&n); int i; int sum=0; for (i=0;i<n;i++) { scanf("%d",&a[i]); a[i]*=2; sum+=a[i]; } sort(a,a+n); for (i=0;i<n;i++) { if (sum>=n*9) { printf("%d ",i); return 0; } sum+=(10-a[i]); } printf("%d ",i); return 0; }
C
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; long long check(long long n,long long x) { if (n<=x) return n; n-=x; return check(n-n/10,x)+x; } int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif long long n; cin>>n; long long l=1,r=n; for (;l<=r;) { long long mid=(l+r)/2; if (check(n,mid)*2>=n) { r=mid-1; } else { l=mid+1; } } cout<<l<<endl; return 0; }
D
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char a[2][105]; int dp[105][4]; int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif scanf("%s%s",a[0],a[1]); int n=strlen(a[0]); int i; dp[0][1]=-10; dp[0][2]=-20; for (i=0;i<n;i++) { int now=0; if (a[0][i]==‘0‘) now++; if (a[1][i]==‘0‘) now++; dp[i+1][0]=-10; dp[i+1][1]=-10; dp[i+1][2]=-10; dp[i+1][now]=max(max(dp[i][0],dp[i][1]),dp[i][2]); if (now>=1) { dp[i+1][now-1]=max(max(dp[i][0],dp[i][1]),dp[i][2]+1); } if (now==2) { dp[i+1][now-2]=max(max(dp[i][0],dp[i][1]+1),dp[i][2]+1); } } printf("%d ",max(dp[n][0],max(dp[n][1],dp[n][2]))); return 0; }
E
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char a[25]; int sum[15]; int res[15]; int c[25][25]; long long ans=0; long long calc() { int sum=0; int i; for (i=0;i<10;i++) { sum+=res[i]; } long long p=1; for (i=0;i<10;i++) { p=p*c[sum][res[i]]; sum-=res[i]; } return p; } void dfs(int x) { if (x==10) { ans+=calc(); if (sum[0]!=0) { res[0]--; ans-=calc(); res[0]++; } return; } if (sum[x]==0) { res[x]=0; dfs(x+1); return; } int i; for (i=1;i<=sum[x];i++) { res[x]=i; dfs(x+1); } } int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif scanf("%s",a); int n=strlen(a); int i; for (i=0;i<n;i++) { sum[a[i]-‘0‘]++; } c[0][0]=1; for (i=1;i<=20;i++) { int j; c[i][0]=1; for (j=1;j<=20;j++) { c[i][j]=c[i-1][j-1]+c[i-1][j]; } } dfs(0); cout<<ans<<endl; return 0; }
F
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<math.h> #include<time.h> #include<vector> #include<bitset> #include<memory> #include<utility> #include<fstream> #include<stdio.h> #include<sstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; map<long long,int> ma; map<long long,string> ma2; int calc(long long x) { int sum=0; for (;x!=0;) { x/=10; sum++; } return sum; } string get_string(long long x) { string t=""; for (;x!=0;) { t=(char)((x%10)+‘0‘)+t; x/=10; } return t; } string t[100005]; int tt[100005]; map<long long,int> ma3; map<long long,string> ma4; int get_val(long long x) { if (ma3.find(x)!=ma3.end()) return ma3[x]; return calc(x); } string get_val2(long long x) { if (ma4.find(x)!=ma4.end()) return ma4[x]; if (x<=100000) return t[x]; return get_string(x); } int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int i; for (i=1;i<=100000;i++) { t[i]=get_string(i); } for (i=1;i<=100000;i++) { tt[i]=calc(i); } for (i=2;i<=100000;i++) { long long p=1; int j; for (j=1;;j++) { p*=i; if (p>10000000000ll) break; if (j==1) continue; if (calc(i)+calc(j)+1>=calc(p)) continue; if (p>=1000) { int ans=1000; if (ma.find(p)!=ma.end()) { ans=ma[p]; } if (calc(i)+1+calc(j)<ans) { ma[p]=tt[i]+1+tt[j]; ma2[p]=t[i]+"^"+t[j]; } } } } //cout<<ma.size()<<endl; //a^b+c //a^b*c+d //a^b+c^d //a^b*c+d^e map<long long,int>::iterator ii; for (ii=ma.begin();ii!=ma.end();ii++) { ma3.insert(*ii); ma4[(*ii).first]=ma2[(*ii).first]; } for (ii=ma.begin();ii!=ma.end();ii++) { int i; if ((*ii).second>3) continue; for (i=1;i<=9;i++) { int now=(*ii).first+i; if (calc(now)<=5) continue; ma3[now]=5; ma4[now]=ma2[(*ii).first]+"+"+(char)(i+‘0‘); } } long long n; cin>>n; int min_ans=calc(n); string min_string=get_string(n); for (ii=ma.begin();ii!=ma.end();ii++) { if (n<(*ii).first) break; long long t=n-(*ii).first; int val; if (ma3.find(t)==ma3.end()) { if (t>=1000000) continue; } else { if (ma3[t]>=6) continue; } string val2; if (n==(*ii).first) { val=(*ii).second; val2=ma2[(*ii).first]; } else { val=(*ii).second+1+get_val(n-(*ii).first); val2=ma2[(*ii).first]+"+"+get_val2(n-(*ii).first); } if (val<min_ans) { min_ans=val; min_string=val2; } } for (ii=ma.begin();ii!=ma.end();ii++) { if (n<(*ii).first) break; int t=n/(*ii).first; if (t==1) continue; if (t>=100000) continue; long long p=n%(*ii).first; if (((ma.find(p)!=ma.end())&&(ma[p]<=3))||(p<1000)) { int val; string val2; if (p==0) { val=(*ii).second+1+get_val(t); if (val>=min_ans) continue; val2=ma2[(*ii).first]+"*"+get_val2(t); } else { val=(*ii).second+1+get_val(t)+1+get_val(p); if (val>=min_ans) continue; val2=ma2[(*ii).first]+"*"+get_val2(t)+"+"+get_val2(p); } if (val<min_ans) { min_ans=val; min_string=val2; } } } cout<<min_string<<endl; return 0; }
以上是关于Codeforces Round #492 (Div.2 Only)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #492 (Div. 2) [Thanks, uDebug!] — 赛后补题
Codeforces Round #436 E. Fire(背包dp+输出路径)
[ACM]Codeforces Round #534 (Div. 2)
CodeforcesCodeforces Round #492 (Div. 2) [Thanks, uDebug!] (Contest 996)