(贪心)Codeforces Round #427 B. The number on the board

来源:互联网 发布:lol网络关注 编辑:程序博客网 时间:2024/06/06 01:19

题目网址: Codeforces Round #427 B. The number on the board

题意分析:

题意:

  • board上写着一串数字,该数字所有数位和大于等于k
  • 但此时某人修改了这串数字的某些数位, 使得这串数字变成了n
  • 求原来这串数字与n最少有多少个不同的数位

思路:

  • 先计算出n数位和cnt
  • 若cnt >= k, 那么最少不同数位可以为 0
  • 如果cnt < k, 计算出这个数与k还相差多少 tmp = k - cnt
  • 贪心, 为了使得最少数位不同, 则尽可能找小的数位来弥补cnt与k的差距
  • 所以对n里面的字符排序(从小到大), 然后 每次 tmp -= (9 - n[i] + ‘0’), (尽可能使用小的数位来弥补差距)

代码:

#include <bits/stdc++.h>using namespace std;int main(int argc, char const *argv[]){    string n;    int k;    while (~scanf("%d", &k))    {        cin >> n;        int len = (int)n.length();        int cnt = 0;        for (int i = 0; i < len; ++i)        {            cnt += (n[i] - '0');        }        if (cnt >= k) printf("0\n");        else        {            sort(n.begin(), n.end());            int tmp = k - cnt;            int i = 0;            int ans = 0;            while (i < len && tmp > 0)            {                tmp -= (9 - n[i] + '0');                ++i;                ++ans;            }            printf("%d\n", ans);        }    }    return 0;}
阅读全文
0 0