CF581C用k去把n个数补成十的整数倍求最大

这题错的更是离谱,我想的好好的,然后代码敲上去,然后交了,竟然可以暂时通过,我也是醉了,而且过了

20组数据,然后看了下我WA的代码,我cmp都写好了,竟然忘记sort一下了,一口鲜血吐出,加了一个sort分分钟

AC,而且记得交之前我还看了下代码,竟然没发现我写的cmp没有用,这题就是先按照把每个数不成十的倍数需要

的大小去排序,然后再从第一个数开始补,补齐的就加上这个补齐后的数字处于十,如果k能用完,剩下的数字,就

直接除于10就行了,不过k没能用完,然后再统计每个数都补成100一共需要多少值,如果剩下的k大于这个值就是这个值

除于10,如果不能就是k处于十,D题错的离谱,C题错的更离谱,啊,我的rating,如果上天再给我一个机会,我一定更加

认真。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<cctype>
#include<queue>
#define LL long long
using namespace std;
const double eps=1e-10;
const double pi=acos(-1.0);
const int N=1e5+10;
struct node
{
    int va;
    int ca;
}a[N];
int cmp(node a,node b)
{
    return a.ca<b.ca;
}
int main()
{
    int n,k;
    while(cin>>n)
    {
       cin>>k;
       for(int i=0;i<n;i++)
       {
           cin>>a[i].va;
           if(a[i].va%10)
           {
               a[i].ca=(a[i].va/10+1)*10-a[i].va;
           }
           else
            a[i].ca=0;
       }
       sort(a,a+n,cmp);
       int sum=0;
       int i;
       for(i=0;i<n;i++)
       {
           if(k>=a[i].ca)
           {
               sum=sum+(a[i].va+a[i].ca)/10;
               k-=a[i].ca;
           }
           else
            break;
       }
       if(i!=n)
       {
           for(;i<n;i++)
            sum+=a[i].va/10;
           cout<<sum<<endl;
       }
       else
       {
           int temp=0;
           for(int i=0;i<n;i++)
            temp=temp+100-a[i].va-a[i].ca;
           if(k>=temp)
            cout<<sum+temp/10<<endl;
           else
            cout<<sum+k/10<<endl;
       }
    }
    return 0;
}
当然我比较喜欢简介的代码,这题代码还可以更简洁:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<cctype>
#include<queue>
#define LL long long
using namespace std;
const double eps=1e-10;
const double pi=acos(-1.0);
const int N=1e5+10;
int a[N];
int main()
{
    int n,k;
    while(cin>>n)
    {
       cin>>k;
       int sum=0;
       for(int i=0;i<n;i++)
       {
          cin>>a[i];
          sum+=a[i]/10;
          a[i]%=10;
       }
       sort(a,a+n);
       reverse(a,a+n);
       for(int i=0;i<n;i++)
       {
           if(10-a[i]<=k)
           {
               sum++;
               k-=(10-a[i]);
           }
       }
       cout<<min(n*10,sum+k/10)<<endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值