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. ANNOTATION and analyse hello1.java

    一.What is annotation? annotation的中文意思就是注解,注释的意思.注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念.它的形式跟接口很类似,不过前面 ...

  2. mybatis传参总结

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

  3. 2n皇后 - 回溯

    题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...

  4. 制作一个最小Linux系统

    使用的是itop4412开发板(仅记录个人的学习回顾,如有不当之处欢迎指出) ---------致谢 准备:busybox软件.uboot(一般和开发板配套).zImage(kernel内核).ram ...

  5. python之cookbook-day01

    第一章:数据结构和算法 1.1 解压序列赋值给多个变量 >>> p = (4, 5) >>> x, y = p >>> x 4 >>& ...

  6. 洛谷 2176 [USACO14FEB]路障Roadblock

    [题意概述] 修改图中任一一条边的边权,使其加倍,问怎样使修改后图中的1~n的最短路最大.输出最短路的增量. [题解] 先跑一遍dijkstra求出1~n的路径长度,记录下经过的边.枚举这些边进行修改 ...

  7. 【Codeforces 711C】Coloring Trees

    [链接] 我是链接,点我呀:) [题意] 连续相同的数字分为一段 你可以改变其中0为1~m中的某个数字(改变成不同数字需要不同花费) 问你最后如果要求分成恰好k段的话,最少需要多少花费 [题解] dp ...

  8. 【Codeforces 300C】Beautiful Numbers

    [链接] 我是链接,点我呀:) [题意] 让你找到长度为n的数字 这个数字只由a或者b组成 且这n个数码的和也是由a或者b组成的 求出满足这样要求的数字的个数 [题解] 枚举答案数字中b的个数为y,那 ...

  9. [luoguP1134] 阶乘问题(数论)

    传送门 我直接用 long long 暴力,居然过了 ——代码 #include <cstdio> int n; long long x, ans = 1; int main() { in ...

  10. 1048 石子归并codevs

    1048 石子归并codevs 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1 ...