NYOJ 679 贪婪的商店

贪婪的商店

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

小明星期天去一家商店买东西,看上了一个玩具,非常想买下来。但是这家商店有这样一个规定,如果要买一件物品A,可能必须要另一件物品B。而要买物品B,可能必须要买另一件物品C。直到买的这件物品不需要买其他物品为止。

经过顾客抗议,商店重新决定如果买一件物品,所需要买其他物品超过一件的话,可以买其中任一件就好。小明钱不多了,他想知道如果要买这件物品,最少要花多少钱。

输入
第一行包含一个整数T(T <= 100).表示测试数据组数。

每组数据第一行包含三个整数N,M,P(1 <= P <= N <= 1000,0 <= m <= 10000),

分别表示商店物品总个数,物品之间关系数量,小明想买物品的编号。

接下来的一行包含N个整数Vi,表示第i个物品的价钱。

接下来的M行每行包含两个整数a,b(1 <= a,b <= N),表示要买物品a就可能要买物品b。

输出
输出“Case #i: ans”(不含引号),i表示第i组数据,ans表示最少花的钱数。
样例输入
2
4 4 1
1 3 2 4
1 2
2 3
2 4
3 4
4 4 2
2 1 3 4
1 2
2 4
1 3
3 4
样例输出
Case #1: 8
Case #2: 5
简单树型DP!
AC码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define MAX 1005
#define INF 9999999
vector<int> adj[MAX];
int dp[MAX],visit[MAX];
int weight[MAX];
int Min(int a,int b)
{
	return a>b?b:a;
}
void DFS(int u)
{
	if(visit[u])
		return;
	int len=adj[u].size(),v;
	if(len==0)
	{
		dp[u]=weight[u];
		return;
	}
	for(int i=0;i<len;i++)
	{
		v=adj[u][i];
		DFS(v);
		visit[v]=1;
		dp[u]=Min(dp[u],dp[v]+weight[u]);
	}
}
int main()
{
	int T,i,count=1;
	int n,m,p,a,b;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&m,&p);
		for(i=0;i<=n;i++)
			adj[i].clear();
		for(i=1;i<=n;i++)
			scanf("%d",&weight[i]);
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&a,&b);
			adj[a].push_back(b);
		}
		memset(visit,0,sizeof(visit));
		for(i=0;i<=n;i++)
			dp[i]=INF;
		DFS(p);
		printf("Case #%d: %d\n",count++,dp[p]);
	}
	return 0;
}

NYOJ 679 贪婪的商店

时间: 2025-01-12 01:39:03

NYOJ 679 贪婪的商店的相关文章

nyoj 47 江 河问题 【贪婪】

经典的贪婪. 两种方案:一个:让我们来最快,第二快,在过去的第一,最快的回.然后最慢,最慢第二,在过去.次最快的回来a[0]+a[1]+a[1]+a[n-1] 二:最快的和最慢的过去,最快的回来,最快的和当前最慢的过去,最快的回来. a[0]+a[n-1]+a[0]+a[n-2] 每次取最优解. 注意:最后剩余没过的人小于等于3的时候.要特殊推断. 代码: #include <cstdio> #include <cstring> #include <algorithm>

NYOJ 662 汽水瓶

汽水瓶 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入 输入文件最多包含

二、应用商店推广

应用商店推广是应用推广中最基本的推广方式之一,效果另说.现在国内比较大的应用商店主要有应用宝,360手机助手,百度手机助手,小米应用商店,华为应用市场,豌豆荚,安智市场,沃商店,联想乐商店,魅族市场等,现在几乎的智能机品牌都有自己的应用商店..手机运营商中国移动.联通.电信运营商,他们主要的有点就是用户基数大. 下面是2016应用商店的TOP10. 下面是一些发布App到应用商店的方法 如何在百度手机助手中发布APP? 如何将app上传到应用宝 如何将应用提交至360开放平台 小米应用商店上传应

NYOJ 707 A Simple Problem(结构体排序) 睡前一水~~

链接:click here 题意: A Simple Problem 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 You know, just as the title imply, this is a simple problem. In a contest, given the team-id, solved, penalty of all the teams, tell me the champion.If the numbers of solved pr

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

NYOJ 49 开心的小明

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

NYOJ 289 苹果

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为: