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

  

原文地址:https://www.cnblogs.com/qioalu/p/4875736.html