bzoj2260: 商店购物 && 4349: 最小树形图
Description
Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火。小店的优惠方案十分简单有趣。Grant规定:在一次消费过程中,如果您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价;如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元/听的优惠价……诸如此类的优惠方案就是说:如果您在本店购买了商品A的话,您就可以以P元/件的优惠价格购买商品B(购买的数量不限)。有趣的是,你需要购买同样一些商品,由于不同的购买顺序,Grant老板可能会叫你付不同数量的钱。比如你需要一块香皂(原价2.50元)、一瓶精制油(原价10.00元)、一听可乐(原价1.80元),如果你按照可乐,精制油,香皂这样的顺序购买的话,Grant老板会问你要13.80元;而如果你按照精制油,香皂,可乐这样的顺序购买的话,您只需付13.50元。
现在该村的居民请你编写一个程序,告诉你Grant小店商品的原价,所有优惠方案及所需的商品,计算至少需要花多少钱。不允许购买任何不需要的商品,即使这样做可能使花得钱更少。
Input
Output
只有一个实数,表示最少需要花多少钱。输出实数须保留两位小数。
Sample Input
10.00 1
1.80 1
3.00 0
2.50 2
2
1 4 2.00
4 2 1.50
Sample Output
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 105
#define maxm 5105
using namespace std;
int n,m,a,b,tim[maxn],sum[maxn],flag[maxn];
double c,ans;
int tmp,best[maxn],bel[maxn],idx,vis[maxn];
struct Graph{
int tot,now[maxn],fa[maxm],son[maxm],pre[maxm];
double val[maxm];
void init(){tot=;memset(now,,sizeof(now));}
void put(int a,int b,double c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c,fa[tot]=a;}
void prepare(){
for (int u=;u<=n;u++) if (!flag[u])
for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if (best[v]==-||val[best[v]]>val[p]) best[v]=p;
memset(vis,-,sizeof(vis));
tmp=n,vis[]=;
for (int i=;i<=n;i++) if (!flag[i]&&vis[i]==-){
int u,v; ++idx;
for (u=i;vis[u]==-;u=fa[best[u]]) vis[u]=idx;
if (vis[u]<idx) continue;
v=u,bel[u]=++tmp,vis[v]=;
for (v=fa[best[v]];vis[v]==idx;v=fa[best[v]]) vis[v]=,bel[v]=tmp;
}
}
}G[];
void work(){
for (int t=;;t^=){
for (int i=;i<=n;i++) best[i]=-;
G[t].prepare(),G[t^].init();
if (tmp==n){
for (int i=;i<=n;i++) if (!flag[i]) ans+=G[t].val[best[i]];
break;
}
for (int u=;u<=n;u++) if (!flag[u]){
for (int p=G[t].now[u],v=G[t].son[p];p;p=G[t].pre[p],v=G[t].son[p]){
if (bel[u]&&bel[v]&&bel[u]==bel[v]) continue;
int a;
if (bel[u]) a=bel[u]; else a=u;
if (bel[v]) G[t^].put(a,bel[v],G[t].val[p]-G[t].val[best[v]]);
else G[t^].put(a,v,G[t].val[p]);
}
if (bel[u]) ans+=G[t].val[best[u]],flag[u]=;
}
n=tmp;
}
printf("%.2lf\n",ans);
}
double low[maxn];
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%lf%d",&c,&tim[i]);
if (tim[i]) G[].put(,i,c),low[i]=c; else flag[i]=;
}
scanf("%d",&m);
for (int i=;i<=m;i++){
scanf("%d%d%lf",&a,&b,&c);
if (flag[a]||flag[b]) continue;
low[b]=min(low[b],c);
G[].put(a,b,c);
}
for (int i=;i<=n;i++) if (!flag[i]) ans+=low[i]*(tim[i]-);
work();
return ;
}
bzoj2260: 商店购物 && 4349: 最小树形图的更多相关文章
- bzoj2260: 商店购物&&4349: 最小树形图
最小树形图问题啊 最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权 做这个用的是朱(jv)刘(lao)算法. 首先假如有多个联通块就无解啦 对应每个点(除了根) ...
- BZOJ 2260 商店购物(最小树形图)
不会最小树形图的出门左转 其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的. 如何确定各种商品第一件购买时的最小价值呢? 考虑如果购买了\(a_i\)这种商品,那么就能以\ ...
- 【BZOJ】4349: 最小树形图
题解 我们只考虑给每个点买一个,之后每个点就可以用最低价格买了 根据最小树形图的算法,就是不断给每个点入度的边找一条最小的 如果构成了树形图就退出,否则把形成了环的点缩成一个点,加上环的权值,然后把指 ...
- 【刷题】BZOJ 4349 最小树形图
Description 小C现在正要攻打科学馆腹地------计算机第三机房.而信息组的同学们已经建好了一座座堡垒,准备迎战.小C作为一种高度智慧的可怕生物,早已对同学们的信息了如指掌. 攻打每一个人 ...
- [JSOI2008]小店购物 & bzoj4349:最小树形图 最小树形图
---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ...
- bzoj4349: 最小树形图&&bzoj2260: 商店购物
双倍经验大法吼 昨天发现不会最小属性图&朱刘算法啊 吓得我赶紧补了一发 朱刘算法模板题 #include <iostream> #include <cstdio> #i ...
- bzoj 4349 最小树形图——朱刘算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349. 学习博客:http://www.cnblogs.com/xzxl/p/7243466 ...
- 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图
目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ...
- 【刷题】BZOJ 2260 商店购物
Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...
随机推荐
- 传统IO与NIO区别二
nio是new io的简称,从jdk1.4就被引入了.现在的jdk已经到了1.6了,可以说不是什么新东西了.但其中的一些思想值得我来研究.这两天,我研究了下其中的套接字部分,有一些心得,在此分享. ...
- 6 Java学习之 枚举
1. 概念 枚举是一种规范,它规范了参数的形式,这样就可以不用考虑类型的不匹配,并且显示的替代了int型参数可能带来的模糊概念. 常用来定义一个final类型的变量(常量),保证输入安全.如 ...
- js获取键盘的keyCode-------Day42
济南今天是大雨倾盆啊,这闷热一扫而空,只是有些电闪雷鸣的,原想在公司里就完毕今天的博客记录的,只是不知道为什么怎么也登不上博客,预计是CSDN当时的server出问题了吧,好在到了晚上,这雷声小了也少 ...
- 数缘社区上对libtom的介绍,贴过来先
http://blog.csdn.net/songlingrebecca/article/details/5879154 基于Bit位运算的C语言库分析及其应用 1 LibTomproject的简要介 ...
- cygwin下用mysql c api连接数据库详解
一.典型错误: 错误1: 命令: gcc -I /usr/include/mysql/ -L /lib/ -lmysqlclient main.c 错误: /tmp/ccT0KqUQ.o:main.c ...
- 自己写的Dapper通用数据访问层
using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Data.O ...
- [转] JavaScript中的属性:如何遍历属性
在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从 ...
- 如何判断Fragment是否对用户可见
背景 最近在开发中遇到了一个问题.我们的app需要统计用户的页面路径,也就是用户使用各个页面的情况.这就需要在不同的页面跳入和跳出时记录下来.但是我们的app主要是由Fragment构成的.而在不同的 ...
- Linux squid 安装配置
linux 代理软件 squid 查看是否安装squid 以上信息表明,本机是已经安装了此软件了 如果没有显示说明没有安装,则可以使用yum工具来安装 安装完软件后我们接着开始配置squid代 ...
- 发现并认为这是jQuery1.4.4的一个Bug
说起来还觉得丢人,公司的系统开发了两年,目前jquery的版本还是用的1.4.4. mantis上的Bug一堆,今天在改bug的时候发现一个jQuery的Bug. 改bug嘛,一开始总是各种调试,总感 ...