您的位置:首页 > 其它

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

2016-11-22 13:30 337 查看

题目大意

题目链接

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 second
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心 构造