Codeforces Technocup 2017

题目链接 http://codeforces.com/contest/729/problem/E

题意:给你n个人,主管id为s,然后给你n个id,每个id上对应一个数字表示比这个人大的有几个。

最后问你有几个人搞错了。

一道简单的贪心题先将比自己大有i个人的存起来然后倒着贪心讲后面的补上前面不足的。当主管搞错时要特殊考虑一下

 拿样例举例

(1)

3 2

2 0 2

(上司数) 0 1 (个数)

        1 0

      2 2

这样显然不符合因为上司为1个的没有而上司为2个的却有2个,所以一定要吧补上一个上司为1的所以有一个人犯错了。

5 3

1 0 0 4 1

(上司数) 0 2(个数)

        1 2

      2 0

        3 0

        4 1

显然这样也不符合不再解释,所以只要把上司为4的往上补就行了。还有要优先处理上司为0的犯错者因为主管只有一个那个人肯定犯错了

所以大致思路就是优先将上司为0的犯错者先往后补,再将后面往前补0最后要达成一串连续不为0的串即可。 

#include <iostream>
#include <cstring>
using namespace std;
const int M = 2e5 + 10;
int a[M] , b[M];
int main()
{
    int n , m;
    cin >> n >> m;
    for(int i = 0 ; i < n ; i++) {
        cin >> a[i + 1];
        b[a[i + 1]]++;
    }
    if(a[m] != 0) {
        int count = 0;
        b[a[m]]--;
        b[0]++;
        count++;
        int temp = 0;
        int sum = 0;
        int gg = n - 1;
        if(b[0] > 1) {
            temp = b[0] - 1;
            count += temp;
        }
        for(int i = 0 ; i < n ; i++) {
            if(b[i] > 0) {
                sum += b[i];
            }
            else {
                while(b[gg] == 0) {
                    gg--;
                }
                if(temp == 0) {
                    b[gg]--;
                    sum++;
                    count++;
                }
                if(temp != 0) {
                    temp--;
                }
                b[i]++;
            }
            if(sum == n) {
                break;
            }
        }
        cout << count << endl;
        return 0;
    }
    else  {
        int count = 0;
        int temp = 0;
        int sum = 0;
        int gg = n - 1;
        if(b[0] > 1) {
            temp = b[0] - 1;
            count += temp;
        }
        for(int i = 0 ; i < n ; i++) {
            if(b[i] > 0) {
                sum += b[i];
            }
            else {
                while(b[gg] == 0) {
                    gg--;
                }
                if(temp == 0) {
                    b[gg]--;
                    sum++;
                    count++;
                }
                if(temp != 0) {
                    temp--;
                }
                b[i]++;
            }
            if(sum == n) {
                break;
            }
        }
        cout << count << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6083563.html