题目链接 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; }