题目大意:
一共有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 ",cnt);