1633: 能量获取(energy)
程序员文章站
2024-03-13 23:22:34
...
: 能量获取(energy)
时间限制: 内存限制:
题目描述
“封印大典启动,请出魂珠!”随着圣主一声令下,圣剑护法和魔杖护法将魂珠放置于封印台上。封印台是一个树形的结构,魂珠放置的位置就是根节点(编号为)。还有n个其它节点(编号~)上放置着封印石,编号为i的封印石需要从魂珠上获取Ei的能量。能量只能沿着树边从魂珠传向封印石,每条边有一个能够传递的能量上限,魂珠的能量是无穷大的。作为封印开始前的准备工作,请你求出最多能满足多少颗封印石的能量需求?
注意:能量可以经过一个节点,不满足它的需求而传向下一个节点。每条边仅能传递一次能量。
输入
第一行一个整数,表示除根节点之外其它节点的数量。
接下来行,第行有三个整数,分别表示i号节点的父节点、i号节点上封印石的能量需求、连接节点i与Fi的边最多能传递多少能量。
输出
最多能满足多少颗封印石的能量需求。
样例输入
4
0 3 2
0 100 100
1 1 1
2 75 80
样例输出
2
提示
对于 的数据,满足。
题解:
考虑贪心,每次取最小值,然后往上更新即可。
#include<bits/stdc++.h>
using namespace std;
#define in inline
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repd(i,a,b) for(int i=a;i>=b;i--)
#define For(i,a,b) for(int i=a;i<b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template<class T>in void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
const int N=5e4+3,M=200004;
int n,ans,id[N];
struct Nod{int fa,v,w,x;}p[N];
in bool cmp(Nod A,Nod B){return A.v<B.v;}
int main(){
g(n);
rep(i,1,n) g(p[i].fa),g(p[i].v),g(p[i].w),p[i].x=i;
sort(p+1,p+1+n,cmp);
rep(i,1,n) id[p[i].x]=i;
rep(i,1,n){
int x=p[i].x,ee=p[i].v;bool flag=0;
while(x){
if(p[id[x]].w<ee){flag=1;break;}
p[id[x]].w-=ee; x=p[id[x]].fa;
}
if(!flag) ans++;
}
return !printf("%d\n",ans);
}
下一篇: UNIX网络编程配置unp.h头文件