Subordinates(贪心)

 

题目大意:

一共有N个员工,其中最高领导人是编号s的人,每个人都只有一个直接领导,每个人都说出了自己领导的个数,问最少有几个人撒谎了。

思路: 合理的贪心是该把排最后的数变成缺少的数字,然后继续判断。 (不一定非要01234 可以011223)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<set>
 7 #include<vector>
 8 #include<stack>
 9 #include<queue>
10 #include<map>
11 using namespace std;
12 #define ll long long
13 #define se second
14 #define fi first
15 const int INF= 0x3f3f3f3f;
16 const int N=2e5+5;
17 
18 int a[N];
19 
20 int main()
21 {
22     int n,s,cnt=0;
23     cin>>n>>s;
24     for(int i=0;i<n;i++){
25         cin>>a[i];
26         if(i!=s-1 && a[i]==0 ) a[i]=INF;
27     }
28     if(a[s-1])  cnt++,a[s-1]=0;
29     sort(a,a+n);
30     int j=1,i=1;
31     while(i<=n-1) //从i=1开始
32     {
33         if(a[i]==j)
34         {
35             while(a[i]==j)
36                 i++;
37         }
38         else
39             cnt++,n--;
40         j++;
41     }
42     cout<<cnt<<endl;
43 }

或者

 1 int main(){
 2     scanf("%d%d", &n, &s);
 3     int cnt = 0;
 4     for(int i=1; i<=n; i++){
 5         scanf("%d", &a[i]);
 6         if(i==s&&a[i]!=0){
 7             cnt++;
 8             a[i] = 0;
 9         }
10         else if(i!=s&&a[i]==0){
11             a[i] = n;
12         }
13         num[a[i]]++;
14     }    
15     sort(a+1,a+1+n);
16     int t = 1;
17     for(int i=1; i<n; i++){
18         if(num[i]==0){
19             cnt++;
20             num[i]++;
21         }
22         t+=num[i];
23         if(t>=n)break;
24     }
25     printf("%d\n",cnt);

 

posted @ 2018-07-08 16:39  木流牛马  阅读(548)  评论(0编辑  收藏  举报