洛谷——P1455 搭配购买

https://www.luogu.org/problem/show?pid=1455

题目描述

明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,……,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

输入输出格式

输入格式:

第1行n,m,w,表示n朵云,m个搭配和你现有的钱的数目

第2行至n+1行,每行ci,di表示i朵云的价钱和价值

第n+2至n+1+m ,每行ui,vi表示买ui就必须买vi,同理,如果买vi就必须买ui

输出格式:

一行,表示可以获得的最大价值

输入输出样例

输入样例#1:

5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

输出样例#1:

1

说明

30%的数据满足:n<=100

50%的数据满足:n<=1000;m<=100;w<=1000;

100%的数据满足:n<=10000;0<=m<=5000;w<=10000.

初衷是练Tarjan的,结果~~~

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 const int N(1e5+15);
 7 int n,m,money;
 8 int u,v,f[N],fa[N];
 9 struct Type
10 {
11     int val,use;
12 } thing[N];
13
14 int find(int x)
15 {
16     return fa[x]==x?x:fa[x]=find(fa[x]);
17 }
18
19 void combine(int x,int y)
20 {
21     int fx=find(x), fy=find(y);
22     if(fx!=fy)
23     {
24         fa[fy]=fx;
25         thing[fx].use+=thing[fy].use;
26         thing[fx].val+=thing[fy].val;
27         thing[fy].use=0; thing[fy].val=0;
28     }
29 }
30
31 int main()
32 {
33     scanf("%d%d%d",&n,&m,&money);
34     for(int i=1;i<=n;i++) fa[i]=i;
35     for(int i=1;i<=n;i++)
36         scanf("%d%d",&thing[i].use,&thing[i].val);
37     for(;m;m--)
38     {
39         scanf("%d%d",&u,&v);
40         combine(u,v);
41     }
42     for(int i=1;i<=n;i++)
43         if(thing[i].use||thing[i].val)
44         for(int j=money;j>=thing[i].use;j--)
45             f[j]=max(f[j],f[j-thing[i].use]+thing[i].val);
46     printf("%d",f[money]);
47     return 0;
48 }
时间: 2024-10-26 09:44:18

洛谷——P1455 搭配购买的相关文章

洛谷P1455 搭配购买

题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,--,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云. 输入输出格式 输入格式: 第1

洛谷1455 搭配购买(并查集)

洛谷1455 搭配购买 本题地址:http://www.luogu.org/problem/show?pid=1455 题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,……,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉

洛谷P1108 低价购买[DP | LIS方案数]

题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低价购买”的原则.写一个程序计算最大购买次数. 这里是某支股票的价格清单: 日期 1 2

【luogu P1455 搭配购买】 题解

题目链接:https://www.luogu.org/problemnew/show/P1455 一句话题目做法:并查集合并+01背包 启示:要每次再find一遍.路径压缩会快.因为合并的时候如果是1连3,3连2,4连2,最后也不能保证一步就能连到fa上去. 结果会是fa[2] = fa[3] = fa[4] = 2. fa[1] = 3. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm>

洛谷1108 低价购买

题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低价购买”的原则.写一个程序计算最大购买次数.这里是某支股票的价格清单:日期  1  2

入门动态规划 洛谷P1108 低价购买

P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循"低价购买:再低价购买"的原则

洛谷P2983 [USACO10FEB]购买巧克力Chocolate Buying

题目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Chocolate Store features N (1 <= N <= 100,000) kinds of chocolate in essentially unlimited quantities. Each type i of chocolate has price P_i (1 <= P_i <= 1

洛谷—— P2983 [USACO10FEB]购买巧克力Chocolate Buying

https://www.luogu.org/problem/show?pid=2983 题目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Chocolate Store features N (1 <= N <= 100,000) kinds of chocolate in essentially unlimited quantities. Each type i of

P1455 搭配购买

#include<bits/stdc++.h>using namespace std;int n,m,w,f[10005],money[10005],v[10005],ans(0),dp[10005],used[10005],k(0);int ww[10005],mm[10005];int find(int x){ if(f[x]==x)return x; return find(f[x]);}void UN(int x,int y){ int a=find(x); int b=find(y)