• 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
    ", min(10*n, sum + k/10));
    36     }
    37     return 0;
    38 }

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

  • 相关阅读:
    程序命名标准规范(自定义与其他标准无关)
    asp.net(C#)excel导入导出类
    CSS 技巧
    sql server 更改端口之后的登入方式
    日志插件 log4net 的使用
    js动态调用方法
    mongodb
    Spring 之工具类中注入bin
    解释:什么是云计算?
    当 ADO.NET 遇上 dynamic
  • 原文地址:https://www.cnblogs.com/windysai/p/4846029.html
Copyright © 2020-2023  润新知