CF581C:Developing Skills解题报告

原题是这样的,The main character of this game has n different skills, each of which is characterized by an integer ai from 0 to 100. The higher the number ai is, the higher is the i-th skill of the character. The total rating of the character is calculated as the sum of the values ​​of  for all i from 1 to n. The expression ⌊ x denotes the result of rounding the number x down to the nearest integer.

At the beginning of the game Petya got k improvement units as a bonus that he can use to increase the skills of his character and his total rating. One improvement unit can increase any skill of Petya's character by exactly one. For example, if a4 = 46, after using one imporvement unit to this skill, it becomes equal to 47. A hero's skill cannot rise higher more than 100. Thus, it is permissible that some of the units will remain unused.

Your task is to determine the optimal way of using the improvement units so as to maximize the overall rating of the character. It is not necessary to use all the improvement units.题意不难。。。大致思路是把数组中的数拿出个位部分然后降序排序(然后就涉及到排序、、= =#),把这些数都加到10。如果数组还没有遍历一遍而数字k已经加完了,那这是结果直接输出就行。如果数组遍历一遍之后k还有多,那就去掉个位剩下的几十随意分配到这些数上就行。另外有一个限制是每个数不能超过100,所以有一个限制条件n*10,当n个数全部能加到100时,最后结果能达到最大的n*10,所以在前面无需考虑这一条限制。

PS.刚开始用快排提了几次都是超时,但是实在想不到怎么提高排序的效率,猛然想到STL,改完果然一遍就AC了。。。= =#贴出代码:

#include 
#include 
#include 
using namespace std;

int main()
{
    int n,m,i,p[100010],sum;
    while(scanf("%d%d",&n,&m)!=EOF){
        sum=0;
        for(i=0;i=0;i--){
            if((p[i]+m)>=10){//尽可能多地把数组中小于10的数都加到10
                sum++;
                m-=(10-p[i]);
            }else{//如果一遍没有遍历玩m已经加完了就可以直接break了
                break;
            }
        }
        if(m>=10){//遍历一遍m不为0就能把十位部分随意分配
            sum+=m/10;
        }
        if(sum>=(n*10)){//总的一个限制,使每个数保证不会超过100
            sum=n*10;
        }
        printf("%d\n",sum);
    }
    return 0;
}


你可能感兴趣的:(CF581C:Developing Skills解题报告)