Position:

List

目录

Bzoj 2260 商店购物

Description

  Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火。小店的优惠方案十分简单有趣。Grant规定:在一次消费过程中,如果您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价;如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元/听的优惠价……诸如此类的优惠方案就是说:如果您在本店购买了商品A的话,您就可以以P元/件的优惠价格购买商品B(购买的数量不限)。有趣的是,你需要购买同样一些商品,由于不同的购买顺序,Grant老板可能会叫你付不同数量的钱。比如你需要一块香皂(原价2.50元)、一瓶精制油(原价10.00元)、一听可乐(原价1.80元),如果你按照可乐,精制油,香皂这样的顺序购买的话,Grant老板会问你要13.80元;而如果你按照精制油,香皂,可乐这样的顺序购买的话,您只需付13.50元。

现在该村的居民请你编写一个程序,告诉你Grant小店商品的原价,所有优惠方案及所需的商品,计算至少需要花多少钱。不允许购买任何不需要的商品,即使这样做可能使花得钱更少。

Input

第一行为一个整数n(1 < =n < =50),表示Grant小店的商品种数。接下来是n行,其中第(i+1)行由一个实数Ci (0 < Ci < =1000)和一个整数Mi (0<=Mi<=100)组成,其间由一个空格分隔,分别表示第i种商品的原价和所需数量。第(n+2)行又是一个整数k,表示Grant小店的优惠方案总数。接着k行,每行有二个整数A,B(1 < =A,B < =n)和一个实数P(0 < =P < 1000),表示一种优惠方案,即如果您购买了商品A,您就可以以P元/件的优惠价格购买商品B,P小于商品B的原价。所有优惠方案的(A,B)都是不同的。为了方便,Grant不收分币,所以所有价格都不会出现分。

Output

只有一个实数,表示最少需要花多少钱。输出实数须保留两位小数。

Sample Input

4

10.00 1

1.80 1

3.00 0

2.50 2

2

1 4 2.00

4 2 1.50

Sample Output

15.50

Bzoj 4349 最小树形图

Description

  小C现在正要攻打科学馆腹地------计算机第三机房。而信息组的同学们已经建好了一座座堡垒,准备迎战。小C作为一种高度智慧的可怕生物,早已对同学们的信息了如指掌。

攻打每一个人的堡垒需要一个代价,而且必须攻打若干次才能把镇守之人灭得灰飞烟灭。

当小C在绞尽脑汁想攻打方案时,突然从XXX的堡垒中滚出来一个纸条:一个惊人的秘密被小C发现了:原来各个堡垒之间会相互提供援助,但是当一个堡垒被攻打时,他对所援助的堡垒的援助就会停止,因为他自己已经自身难保了。也就是说,小C只要攻打某个堡垒一次之后,某些堡垒就只需要花更小的代价攻击了。

现在,要你求消灭全机房要用掉代价最小多少。

Input

第一行一个数N,(N < =50),表示机房修建的堡垒数。

接下来N行,每行两个数,第一个实数Ai表示攻打i号堡垒需要的代价Ai(0 < Ai < =1000)。第二个数Bi(0 < Bi < 100)表示i号堡垒需要被攻打Bi次。

接下来一个数k,表示总共有k组依赖关系。

接下来k行每行三个数x,y,z(x,y,为整数,z为实数),表示攻打过一次x号堡垒之后,攻打y号堡垒就只要花z的代价,保证z比y原来的代价小。

不需要攻打的城堡不允许攻打。

Output

一行,一个实数表示消灭全机房要用的最小代价,保留两位小数。

Sample Input

4

10.00 1

1.80 1

3.00 0

2.50 2

2

1 4 2.00

4 2 1.50

Sample Output

15.50

CJ-test

Solution

乍看一眼这不都是一样的题吗?出题人就是这样,改个题面,就变了哦~多做题还是有好处的。

以下Solution以CJ-test为准

这个题对于每件物品只需要一件,那么对其它的影响就生效,并且每个买一件,那么接下来就可以用最小代价买剩下要买的物品。

那么如何每个物品买一个?这里就要决定购买的顺序了。显然的最小树形图模板,不懂算法,传送门:Directed_MST 最小树形图

Notice:

  1. 如果一个物品要买的数量为0,将其除去(为了算法的正常实行,可能图就不连通了)
  2. Combine时注意新权值减去的是之前标号的s[x]
  3. 注意自环的情况,见第一个break

Code

// <shopping.cpp> - Wed Sep 14 08:15:57 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is. #include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#define MOD 1000000007
using namespace std;
typedef long long LL;
const int MAXN=100010;
const int MAXM=100010;
inline int max(int &x,int &y) {return x>y?x:y;}
inline int min(int &x,int &y) {return x<y?x:y;}
inline int gi() {
register int w=0,q=0;register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')q=1,ch=getchar();
while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
return q?-w:w;
}
#define IN inline
#define RG register
struct Directed_MST{
static const int N=110,M=N*N;
static const double INF=1e9;
int m,n,root;
double w[M],s[N],ans,c[N];
int u[M],v[M],pre[N],id[N],k[N],f[N];
void Combine(){
for(int i=1;i<=m;i++){
int gg=v[i];u[i]=id[u[i]];v[i]=id[v[i]];
if(u[i]!=v[i])w[i]-=s[gg];//gg is important
}
}
void ZLEdmonds(){
while(true){
for(int i=1;i<=n;i++)s[i]=INF;
for(int i=1;i<=m;i++)
if(w[i]<s[v[i]]&&u[i]!=v[i])s[v[i]]=w[i],pre[v[i]]=u[i];
for(int i=1;i<=n;i++) {
if(i == root) continue;
if(s[i] == INF) break;
}
int cnt=1;
memset(id,-1,sizeof(id));
memset(f,0,sizeof(f));
s[root]=0;
for(int i=1;i<=n;i++){
ans+=s[i];int x=i;
while(f[x]!=i&&x!=root)
f[x]=i,x=pre[x];
if(x!=root&&id[x]==-1){
for(int o=pre[x];o!=x;o=pre[o])
id[o]=cnt;
id[x]=cnt++;
}
}
if(cnt==1)break;
for(int i=1;i<=n;i++)if(id[i]==-1)id[i]=cnt++;
Combine();n=cnt-1;root=id[root];
}
printf("%.2lf",ans);
}
void Work(){
int cnt=gi();n=0;memset(id,0,sizeof(id));
for(int i=1;i<=cnt;i++){
scanf("%lf",&c[++n]);k[n]=gi()-1;
if(k[n]<0){n--;continue;}id[i]=n;
}
m=ans=0;n++;root=n;int mm=gi();
for(int i=1;i<n;i++)u[++m]=n,v[m]=i,w[m]=c[i];
for(int i=1;i<=mm;i++){
int x=gi(),y=gi();double p;scanf("%lf",&p);
if(!(id[x]&&id[y]))continue;
u[++m]=id[x];v[m]=id[y];w[m]=p;c[id[y]]=min(c[id[y]],p);
}
for(int i=1;i<n;i++)ans+=k[i]*c[i];
ZLEdmonds();
}
}ZL;
int main()
{
freopen("shopping.in","r",stdin);
freopen("shopping.out","w",stdout);
ZL.Work();
return 0;
}

【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图的更多相关文章

  1. Luogu2792 JSOI2008 小店购物 最小树形图

    传送门 被题意杀 本以为一个种类的物品一定要一起买 看了题解才知道可以先把所有要买的物品买一个,剩下要买的物品就可以得到这个种类的物品能够得到的最大优惠-- 所以现在只需要知道:第一次买所有物品一遍时 ...

  2. 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)

    题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...

  3. 洛谷P2792 [JSOI2008]小店购物(最小树形图)

    题意 题目链接 Sol 一开始的思路:新建一个虚点向每个点连边,再加上题面中给出的边,边权均为大小*需要购买的数量 然后发现死活都过不去 看了题解才发现题目中有个细节--买了\(A\)就可以买\(B\ ...

  4. bzoj2260: 商店购物 && 4349: 最小树形图

    Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...

  5. bzoj2260: 商店购物&&4349: 最小树形图

    最小树形图问题啊 最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权 做这个用的是朱(jv)刘(lao)算法. 首先假如有多个联通块就无解啦 对应每个点(除了根) ...

  6. [JSOI2008]小店购物 & bzoj4349:最小树形图 最小树形图

    ---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ...

  7. BZOJ 2260 商店购物(最小树形图)

    不会最小树形图的出门左转 其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的. 如何确定各种商品第一件购买时的最小价值呢? 考虑如果购买了\(a_i\)这种商品,那么就能以\ ...

  8. bzoj4349: 最小树形图

    最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...

  9. hdu 4966 GGS-DDU (最小树形图)

    比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...

随机推荐

  1. 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

    学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...

  2. mybatis传参总结

    注:文章引用部分 mybatis传递参数总结文章内容 一.单个参数 1.基本数据类型 (1)直接使用 List<ChargeRuleDO> tests(long id); <sele ...

  3. 透彻分析C/C++中memset函数

    在C语言中,经常需要对内存进行操作,里面涉及很多函数,但是memset函数的使用有一点需要大家格外注意,这也是我在做项目时遇到过的一个问题,调试了很久才找出来错误. 函数原型是:void *memse ...

  4. <SpringMvc>入门六 异常处理

    如果不做异常处理,那么一直将错误向上抛出,则会最后在页面上显示错误代码 服务启动后,访问test1方法,页面会报500 为了提示友好的错误页面,所以需要做异常处理 1.编写自定义异常类(做提示信息的) ...

  5. db2构建临时结果集

    一 values  ('1',2,3)   为一行   ‘1’   2    3   行数据类型可以不同  values  ('1',2,3),('f',5,6) 为两行 (values  1,2,3 ...

  6. PAT 1141 PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  7. @requestbody---接受前端传json对象并绑定javabean

    @requestbody---接受前端传json对象并绑定javabean----https://blog.csdn.net/ljxbbss/article/details/74452326 最近代码 ...

  8. HDU 1085 多重背包转化为0-1背包问题

    题目大意: 给定一堆1,2,5价值的硬币,给定三个数表示3种价值硬币的数量,任意取,找到一个最小的数无法取到 总价值为M = v[i]*w[i](0<=i<3) 那么在最坏情况下M个数都能 ...

  9. 【Tomcat】tomcat配置多域名和虚拟路径

    当我们用浏览器在访问网页的时候,如访问www.baidu.com,一般都认为会在DNS服务器上找这个域名对应的IP,然后向这个IP发送请求 并响应,其实在DNS服务器解析之前,本机会先在你的系统配置文 ...

  10. SecureCRT复制粘贴快捷键

    复制:[Ctrl]+[Insert] 粘贴:[Shift]+[Insert]