题目:消防局的设立
思路:
以前类似的题目都写的dp,第一次写贪心。
就是从最深的点开始,如果到最近的有消防局的点的距离大于2,就在它祖父那里设一个消防站。
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxn 1000
struct srt{
int x,y;
bool operator <(const srt& oth) const {
return y>oth.y;
}
};
int n;
int fa[maxn+5];
int v[maxn+5];
srt s[maxn+5];
int main() {
read(n);
for(int i=2;i<=n;i++) {
read(fa[i]);
}
s[0].y=-1;
for(int i=0;i<=n;i++) {
s[i].x=i;
s[i].y=s[fa[i]].y+1;
v[i]=n;
}
sort(s+1,s+n+1);
int ans=0;
for(int i=1;i<=n;i++) {
int j=s[i].x;
v[j]=min(v[j],min(v[fa[j]]+1,v[fa[fa[j]]]+2));
if(v[j]>2) {
int k=fa[fa[j]];
v[k]=0;
v[fa[k]]=min(1,v[fa[k]]);
v[fa[fa[k]]]=min(2,v[fa[fa[k]]]);
ans++;
}
}
printf("%d",ans);
return 0;
}