Codeforce round# 380 E(贪心,构造)

来源:互联网 发布:python分析web日志 编辑:程序博客网 时间:2024/05/21 09:34

题目大意

题目链接
E. Subordinates
给你一棵有根树,让树上的节点挨着报告自己的祖先个数,问至少多少个节点说错了

分析

先排序,
贪心,想想,如果树的长度越长那么出现错误的节点就会越少,所以如果有一个错误的节点就让他增加当前扫描到的树的长度,并且如果有节点会发生错误,显然让最长的节点出现错误比较优(有点绕~)具体说来就是,每次扫描的时候如果当前节点发生错误就让最后面的节点来补这个位置。

AC代码

#include <cstdio>#include <cstring>#include <queue>#include<algorithm>#include<iostream>#include<cmath>#include<map>#include<string>#include<vector>#define INF 0x3f3f3f3f#define maxn 2e5+10#define fi first#define se secondusing namespace std;typedef long long LL;typedef unsigned long long uLL;typedef pair<int,int> PI;typedef map<int,int> Mii;typedef map<int,int>::iterator MI;int a[(int)maxn];int main(){        //freopen("H:\\c++\\file\\stdin.txt","r",stdin);  int n,s;  cin>>n>>s;  for(int i=0 ; i<n ; ++i)  {      scanf("%d",&a[i]);  }  int ans =0;  if(a[s-1]!=0){a[s-1] = 0;ans =1;}  for(int i = 0; i<n ; ++i)    if(i !=s-1 && a[i]==0)a[i] = n+1;  sort(a,a+n);  int L =1;  for(int i = 1; i<n ; ++i)  {      if(a[i]<=L){L = max(a[i]+1,L) ; continue;}      while(a[i]>L &&i<n)      {          L++;n--;ans++;      }      L++;  }    cout<<ans<<endl;    return 0;}
1 0
原创粉丝点击