Codeforces Round #322 (Div. 2) A B C
比赛地址: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\n",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("\n");
}
}
}
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\n",sum);
}
return 0;
}

浙公网安备 33010602011771号