【模拟试题】炸弹拆除(BSOI2566)
来源:互联网 发布:淘宝有香烟卖吗 编辑:程序博客网 时间:2024/06/09 19:05
【模拟试题】炸弹拆除
Description
连锁炸弹是恐怖分子最近开始使用的一种威力巨大的爆炸物。其复杂的结构使拆除它的难度大大增加了。
一个连锁炸弹由m个引爆装置和n枚炸弹组成。每个引爆装置中有n条信号线分别与这n枚炸弹相连(1号线连接炸弹1,2号线连接炸弹2,……)。与一枚炸弹相连的m条信号线中只有一条是“安全线”——剪断后可以拆除炸弹,而剪断其它信号线则引爆炸弹。
专业的技术人员将给出一个m×n的表格。其中第i行第j列显示了引爆装置i与炸弹j连接的信号线是“安全线”的可能性Pi,j(Pi,j ∈(0,1)),并且已知每个引爆装置上的“安全线”数目不超过k 。技术人员的分析结果是绝对值得信任的。
[任务]:
政府的安全部门常常雇佣一些程序员去设计解决突发情况的程序。其中一项任务正是提高排除连锁炸弹的成功率。成功的拆除一个连锁炸弹,必须切断与炸弹相连所有n条“安全线”。现在,请设计一个程序,求出应剪断哪n条信号线,才能使拆除所有炸弹的可能性 ∏ Pi,j(即所有剪断的信号线Pi,j的乘积)最大。
一个连锁炸弹由m个引爆装置和n枚炸弹组成。每个引爆装置中有n条信号线分别与这n枚炸弹相连(1号线连接炸弹1,2号线连接炸弹2,……)。与一枚炸弹相连的m条信号线中只有一条是“安全线”——剪断后可以拆除炸弹,而剪断其它信号线则引爆炸弹。
专业的技术人员将给出一个m×n的表格。其中第i行第j列显示了引爆装置i与炸弹j连接的信号线是“安全线”的可能性Pi,j(Pi,j ∈(0,1)),并且已知每个引爆装置上的“安全线”数目不超过k 。技术人员的分析结果是绝对值得信任的。
[任务]:
政府的安全部门常常雇佣一些程序员去设计解决突发情况的程序。其中一项任务正是提高排除连锁炸弹的成功率。成功的拆除一个连锁炸弹,必须切断与炸弹相连所有n条“安全线”。现在,请设计一个程序,求出应剪断哪n条信号线,才能使拆除所有炸弹的可能性 ∏ Pi,j(即所有剪断的信号线Pi,j的乘积)最大。
Input
输入的第一行为3个整数m、n、k(用空格分隔开)。(m≤50,k≤n≤50)
接下来的m行,每行有n个实数(用空格分隔开)。这就是技术人员提供的表格,其内容已经在问题中详细说明了(Pi,j为 (0,1) 的实数 )。
接下来的m行,每行有n个实数(用空格分隔开)。这就是技术人员提供的表格,其内容已经在问题中详细说明了(Pi,j为 (0,1) 的实数 )。
Output
仅一个数据,最大成功拆除的可能性(4位有效数字)。
Sample Input
4 5 2
0.95 0.20 0.57 0.48 0.50
0.56 0.88 0.42 0.80 0.90
0.70 0.65 0.42 0.60 0.87
0.91 0.80 0.72 0.44 0.20
Sample Output
0.4189
Hint
对应的拆除方案是:切断引爆装置1上的1号线;切断引爆装置2上的2,4号线;切断引爆装置3上的5号线;切断引爆装置4上的3号线。
Solution
表面上是一道非常裸的费用流,但是要求的是最大乘积,所以常规的最大费用算法就失效了。
这个时候就要用到一些奇妙的数学知识了。将我们的费用f转化为lg(f),然后我们照常使用费用流,最后得到的最大和x再输出10^x,就是答案了。
Source
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<queue>using namespace std;struct Pipe{int next,to,flow;double cost;}pipe[10005];int h[505],cnt=1;inline void add(int x,int y,int z,double k){pipe[++cnt].to=y;pipe[cnt].next=h[x];h[x]=cnt;pipe[cnt].flow=z;pipe[cnt].cost=k;pipe[++cnt].to=x;pipe[cnt].next=h[y];h[y]=cnt;pipe[cnt].flow=0;pipe[cnt].cost=-k;return ;}int N,M,K;int st,ed;double ans=0.0;int vis[505],prep[505],pree[505];double dis[505];inline bool SPFA(int st,int ed){ int i,j,p;memset(vis,0,sizeof(vis));memset(prep,0,sizeof(prep));for(i=0;i<=500;i++)dis[i]=-1e100;//极大负值 queue<int> q;q.push(st);vis[st]=1;dis[st]=0;while(!q.empty()){p=q.front();q.pop();vis[p]=0;for(i=h[p];i;i=pipe[i].next){j=pipe[i].to;if(pipe[i].flow&&dis[j]<dis[p]+pipe[i].cost){dis[j]=dis[p]+pipe[i].cost;prep[j]=p;pree[j]=i;if(!vis[j]){q.push(j);vis[j]=1;}}}}return dis[ed]!=-1e100;}inline void Adjust(){int i,j,p=0x3f3f3f3f;for(i=ed;i!=st;i=prep[i]){j=pree[i];pipe[j].flow-=1;pipe[j^1].flow+=1;}//这张图的容量都是一,无需寻找Max delta ans+=dis[ed];}int main(){cin>>M>>N>>K;st=0;ed=N+M+1;int i,j;double x;for(i=1;i<=M;i++)add(st,i,K,0);for(i=1;i<=N;i++)add(i+M,ed,1,0);for(i=1;i<=M;i++){for(j=1;j<=N;j++){cin>>x;add(i,j+M,1,log(x));//log}}while(SPFA(st,ed))Adjust();printf("%.4lf",exp(ans));//返回 return 0;}
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<queue>using namespace std;struct Pipe{int next,to,flow;double cost;}pipe[10005];int h[505],cnt=1;inline void add(int x,int y,int z,double k){pipe[++cnt].to=y;pipe[cnt].next=h[x];h[x]=cnt;pipe[cnt].flow=z;pipe[cnt].cost=k;pipe[++cnt].to=x;pipe[cnt].next=h[y];h[y]=cnt;pipe[cnt].flow=0;pipe[cnt].cost=-k;return ;}int N,M,K;int st,ed;double ans=0.0;int vis[505],prep[505],pree[505];double dis[505];inline bool SPFA(int st,int ed){ int i,j,p;memset(vis,0,sizeof(vis));memset(prep,0,sizeof(prep));for(i=0;i<=500;i++)dis[i]=-1e100;//极大负值 queue<int> q;q.push(st);vis[st]=1;dis[st]=0;while(!q.empty()){p=q.front();q.pop();vis[p]=0;for(i=h[p];i;i=pipe[i].next){j=pipe[i].to;if(pipe[i].flow&&dis[j]<dis[p]+pipe[i].cost){dis[j]=dis[p]+pipe[i].cost;prep[j]=p;pree[j]=i;if(!vis[j]){q.push(j);vis[j]=1;}}}}return dis[ed]!=-1e100;}inline void Adjust(){int i,j,p=0x3f3f3f3f;for(i=ed;i!=st;i=prep[i]){j=pree[i];pipe[j].flow-=1;pipe[j^1].flow+=1;}//这张图的容量都是一,无需寻找Max delta ans+=dis[ed];}int main(){cin>>M>>N>>K;st=0;ed=N+M+1;int i,j;double x;for(i=1;i<=M;i++)add(st,i,K,0);for(i=1;i<=N;i++)add(i+M,ed,1,0);for(i=1;i<=M;i++){for(j=1;j<=N;j++){cin>>x;add(i,j+M,1,log(x));//log}}while(SPFA(st,ed))Adjust();printf("%.4lf",exp(ans));//返回 return 0;}
0 0
- 【模拟试题】炸弹拆除(BSOI2566)
- CS中如何拆除炸弹
- 【不知出处】炸弹拆除 网络流 费用流
- 拆除
- 蓝桥杯试题:星系炸弹
- 引爆炸弹-蓝桥杯模拟赛
- (贪心)NOIP模拟题:引爆炸弹
- BZOJ 1218 HNOI 2003 激光炸弹 模拟
- Box2D物理引擎模拟炸弹爆炸效果
- Box2D物理引擎模拟炸弹爆炸效果
- 2017年蓝桥杯模拟赛-9引爆炸弹
- 计蒜客蓝桥杯模拟赛5 引爆炸弹
- 计蒜客蓝桥杯模拟赛5 引爆炸弹
- 炸弹
- 炸弹
- 炸弹
- 炸弹
- 炸弹
- 如何评估模型的预测性能?
- 安装PYPY 和对应的 pypy pip
- Ubuntu12.04安装TFTP服务
- 光标变成黑块变粗 影响插入 解决方法
- web前端项目中的更现代化的reset.css
- 【模拟试题】炸弹拆除(BSOI2566)
- 练习
- 【PAT】1117. Eddington Number
- 【GDOI2014】beyond
- jQuery实现Ajax详解
- 第一章 Web MVC简介
- 【我的Android进阶之旅】快速创建和根据不同的版本类型(Dev、Beta、Release)发布Android 开发库到Maven私服
- Linux中的磁盘分区与挂在
- Android 开发第一站-android 安装教程