zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    8.13 Java自学
    8.12 Java自学
    8.11 Java自学
    JAVA学习日报 8.18
    JAVA学习日报 8.17
    JAVA学习日报 8.16
    JAVA学习日报 8.15
    JAVA学习日报 8.14
    JAVA学习日报 8.13
    JAVA学习日报 8.12
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6083563.html
Copyright © 2011-2022 走看看