codeforces 581C. Developing Skills 解题报告

题目链接:http://codeforces.com/problemset/problem/581/C

题目意思:给出 n 个数:a1, a2, ..., an (0 ≤ ai ≤ 100)。给出值 k,可以把它加到任意的 ai 中,成为ai',对每个ai 加多少随你定,但是不能超过 100,k也不一定需要用完。现在需要求得最终的和⌊a1'⌋+⌊a2'⌋ + ... + ⌊an'⌋,使其最大。

  比赛的时候真的很中规中矩地做,有那么一点思路:将 k 中的某些unit 加入到每个数中(而且优先需要处理那些(个位+x)越靠近 x 的那些数(x mod 10 == 0),这样才能保证 floor(ai) 至少增加 1。所以需要排序啦。。。那时出现一点点小故障,赛后才发现排序排错了,我是从大到小排每个数的,其实是个位排序。还有就是我又将问题复杂化了,竟然用到平均数,汗~~ [-_-|||

  大家请看题解吧~~浅显易懂

  

  最后讲讲代码中为什么最后的ans 有个 n*10。这是因为最大的ans是不超过 n * 10 的(序列形式为:100 100 100 100...100);

  k/10 是因为 加完之后,有可能剩下的 k 值还比较多,于是随便加入到某个 ai 中,最终的和是多少视乎 k / 10 还有多少(不考虑 ai 已经为100的情况, n*10 已经有约束)

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int maxn = 1e5 + 5;
 9 int a[maxn];
10 
11 int main()
12 {
13     int n, k;
14     #ifndef ONLINE_JUDGE
15         freopen("in.txt", "r", stdin);
16     #endif // ONLINE_JUDGE
17 
18     while (scanf("%d%d", &n, &k) != EOF) {
19         int sum = 0;
20         for (int i = 0; i < n; i++) {
21             scanf("%d", &a[i]);
22             sum += a[i]/10;
23             a[i] %= 10;
24         }
25 
26         sort(a, a+n);
27         reverse(a, a+n);
28 
29         for (int i = 0; i < n; i++) {
30             if (10-a[i] <= k) {
31                 sum++;
32                 k -= (10-a[i]);
33             }
34         }
35         printf("%d\n", min(10*n, sum + k/10));
36     }
37     return 0;
38 }

  C 题还是要继续努力才能做得出来啊,啊,啊~~~

转载于:https://www.cnblogs.com/windysai/p/4846029.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值