纪中DAY12做题小结

T1:能量获取

Description
“封印大典启动,请出Nescafe魂珠!”随着圣主applepi一声令下,圣剑护法rainbow和魔杖护法freda将Nescafe魂珠放置于封印台上。封印台是一个树形的结构,魂珠放置的位置就是根节点(编号为0)。还有n个其他节点(编号1-n)上放置着封印石,编号为i的封印石需要从魂珠上获取Ei的能量。能量只能沿着树边从魂珠传向封印石,每条边有一个能够传递的能量上限Wi,魂珠的能量是无穷大的。作为封印开始前的准备工作,请你求出最多能满足多少颗封印台的能量需求?
注意:能量可以经过一个节点,不满足它的需求而传向下一个节点。每条边仅能传递一次能量。

Input
第一行一个整数n,表示除根节点之外的其他节点的数量。
接下来n行,第i+1行有三个整数Fi、Ei、Wi,分别表示i号节点的父节点、i号节点上封印石的能量需求、连接节点i与Fi的边最多能传递多少能量。

Output
最多能满足多少颗封印石的能量需求。

Sample Input

4 
0 3 2
0 100 100
1 1 1
2 75 80

Sample Output

2

Data Constraint
对于100%的数据,满足1<=n<=1000,0<=Fi<=n,0<=Ei,Wi<=100

简要思路:这道题主要思想是贪心,即贪心地选一个满足条件且需要能量最少的点,并且向上传减少的能量。至于证明吧,还是那句话,感性理解吧 。首先,假设有一个最优解,它不包括满足条件的能量最少的点,那么此时只要在合适的地方选择不满足一个点的能量,将省下的能量传递给那个能量需求最小且符合题意的点,此时剩下的总能量(因为满足不大于边,实际可利用总能量是有限的)更多,有更多的希望满足更多的点。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
int n , bcnt , tot;
bool flag;
int fa[N] , val[N];
struct no{
   
	int pos;
	int need;
}node[N];
inline void read( int & res ) {
   
	res = 0;
	int pd = 1;
	char a = getchar();
	while ( a < '0' || a > '9' ) {
   
		if ( a == '-' ) {
   
			pd = -pd;
		}
		a = getchar();
	}
	while ( a >= '0' && a <= '9' ) {
   
		res = ( res << 1 ) + ( res << 3 ) + ( a - '0' );
		a = getchar();
	}
	res *= pd;
	return;
}
inline bool cmp( no a , no b ) {
   
	return a.need < b.need;
}
int main () {
   
	read(n);
	for ( int i = 1 ; i <= n ; ++i ) {
   
		read(fa[i]);
		read(node[i].need);
		read(val[i]);
		node[i].pos = i;
	}
	tot = 0;
	sort( node + 1 , node + 1 + n , cmp );
	for ( int i = 1 ; i <= n ; ++i ) {
   
		flag = true;
		for ( int j = node[i].pos ; j ; j = fa[j] ) {
   
			if ( val[j] < node[i].need ) {
   
				flag = false;
				break;
			}
		}
		if ( !flag ) {
   
			continue;
		}
		tot++;
		for ( int j = node[i].pos ; j ; j = fa[j] ) {
   
			val[j] -= node[i].need;
		}
	}
	printf("%d",tot);
	return 0;
}

T2:封印一击

Description
“圣主applepi于公元2011年9月创造了Nescafe,它在散发了16吃光辉之后与公元2011年11月12日被封印为一颗魂珠,贮藏于Nescafe神塔之中。公元2012年9月,圣主带领四大护法重启了Nescafe,如今已经是Nescafe之魂的第30吃传播了。不久,它就要被第二次封印,而变成一座神杯。。。”applepi思索着Nescafe的历史,准备着第二次封印。
Nescafe由n种元素组成(编号为1~n),第i种元素有一个封印区[ai,bi]。当封印力度E小于ai时,该元素获得ai的封印能量;当封印力度E在ai到bi之间时,该元素将获得E的封印能量;而当封印力度E大于bi时,该元素将被破坏从而不能获得任何封印能量。现在圣主applepi想选择恰当的E,使得封印获得的总能量尽可能高。为了封印的最后一击尽量完美,就请你写个程序帮他计算一下吧!

Input
第一行一个整数N。
接下来N行每行两个整数ai、bi,第i+1行表示第i种元素的封印区间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值