题目链接: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 ", min(10*n, sum + k/10)); 36 } 37 return 0; 38 }
C 题还是要继续努力才能做得出来啊,啊,啊~~~