哈理工OJ 2261 近代化改修(排序+贪心)

来源:互联网 发布:用户登录深澜软件 编辑:程序博客网 时间:2024/05/22 03:02

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2261

近代化改修
Time Limit: 3000 MS Memory Limit: 32768 K
Total Submit: 173(52 users) Total Accepted: 40(35 users) Rating: Special Judge: No
Description
舰娘们的战斗力可以用一个数值来表示,又分成了面板战斗力和实际战斗力。他们的换
算关系是:如果一个舰娘的面板战斗力为x的话,那么她的实际战斗力为⌊x/10⌋(⌊x⌋表示对x向下取整数)。
显然舰娘的面板战斗力不能无限高,所以她们的面板战斗力的上限是 100。

我们还能通过近代化改修的方式来增强舰娘的面板战斗力,每次近代化改修可是使得一个舰娘的面板战斗力加1。假定现在我们的狗粮可以支持近代化改修p次,那么能得到的最大实际战斗力的总和是多少?

Input
数据的第一行包括一个整数T,表示数据的组数。

每组数据的第一行包括了两个整数n(1≤n≤10^5)和p(1≤p≤10^7),分别表示舰娘的数量和最大的近代化改修的次数。

接下来的一行有n个整数,ai(1≤ai≤100)表示第i个舰娘的当前面板战斗力。
Output
每组数据的输出包括一行,有一个整数,表示最大的实际战斗力。
Sample Input
3

2 4

7 9

3 8

17 15 19

2 2

99 100
Sample Output
2

5

20
Source
“尚学堂杯”2015级程序设计竞赛(10月)正式赛
Author
TwIStOy

【思路分析】先给所有的舰娘按缺多少可以成为10的倍数进行排序,注意每个舰娘的最大面板战斗力为100,然后按照缺的少的优先进行分配,最后剩余的特殊处理一下就好了。
【AC代码】

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long longstruct node{    LL x,cha;}a[100005];bool cmp(node p,node q){    return p.cha<q.cha;}int main(){    LL t,n,q;    scanf("%lld",&t);    while(t--)    {        scanf("%lld%lld",&n,&q);        for(LL i=1;i<=n;i++)        {            scanf("%lld",&a[i].x);            if(a[i].x>100)            {                a[i].x=100;            }            if(a[i].x%10)            a[i].cha=10-(a[i].x%10);            else                a[i].cha=0;        }        LL sum=0,ss=0;        sort(a+1,a+n+1,cmp);        for(LL i=1;i<=n;i++)        {            if(q>=a[i].cha)            {                q-=a[i].cha;                sum+=(a[i].x+a[i].cha)/10;                ss+=(10-(a[i].x+a[i].cha)/10);            }            else            {                sum+=a[i].x/10;                ss+=(10-(a[i].x/10));            }        }        sum+=min(ss,q/10);        printf("%lld\n",sum);    }    return 0;}
0 0
原创粉丝点击