比赛地址:http://codeforces.com/contest/581
A题
大水题,n双红袜子,m双蓝袜子,求有几天可以混着穿,有几天可以有袜子穿。
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { printf("%d %d ",min(n,m),(max(n,m)-min(n,m))/2); } return 0; }
B题
题意:给一个数列,问从最右边开始的每个数,需要加多少才能成为到目前为止最大的数。
记录一下当前最大值,然后确定一下到底需要加多少,记录一下,输出。
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int s[101101],vis[101101]; int main() { int n,m; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&s[i]); } int max1=-1; for(int i=n;i>=1;i--) { if(s[i]>max1) { max1=s[i]; vis[i]=0; } else { vis[i]=max1-s[i]+1; } } for(int i=1;i<=n;i++) { printf("%d",vis[i]); if(i!=n) { printf(" "); } else { printf(" "); } } } return 0; }
C题
贪心
卧槽终于做到C题了好鸡冻!!!
然而并没有,BIG WATER PROBLEM!!
题意:n个技能,m个加速器,每个加速器可以为技能加一(技能不能超过100),要求【技能值/10】的最大和。
很明显,如果使用加速器的话,最好的结果是,用加速器让更多的数达到10,这样的话就可以使得最后的和最大了!!
根据数字的个位数与10的距离sort一下,小的在前面。
然后遍历一遍,看能让几个数字成为下一个10的倍数。
两个小trick:
1.加技能的时候,技能值不能超过100.
2.如果所有的数字都达到了10的倍数,而且加速器还有剩余,那么就比较一下(n*10-已经被加速的,m/10);
TALK IS CHEAP !
SHOW CODE !
AC 代码:
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; struct node { int a; int b; } s[101101]; bool cmp(node A,node B) { return A.b>B.b; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int ss=0; for(int i=0; i<n; i++) { scanf("%d",&s[i].a); s[i].b=s[i].a % 10; ss+=s[i].b+90; } sort(s,s+n,cmp); for(int i=0; i<n; i++) { int k=10-s[i].b; if(m>=k) { if((s[i].a+k)<=100) { m-=k; s[i].a+=k; } } else { m=0; break; } } int sum=0; for(int i=0; i<n; i++) { int k1= s[i].a / 10 ; sum+=k1; } if(m>0) { sum+=min(m/10,(10*n)-sum); } printf("%d ",sum); } return 0; }