佳佳的魔法药水
来源:互联网 发布:记录恋爱的软件 编辑:程序博客网 时间:2024/04/28 21:09
QAQ
迪杰斯特拉算法
cost[i]表示获得i药水所需要的最小代价,f[i]表示i药水是否已经找到了最小花费,ans[i]表示i药水在当前最小花费的方案数,f[i][j]表示i药水与j药水能够合成的药水
类似于迪杰斯特拉,每次找一个值最小但却没有确定最小值的药水,将其标记为最小值,然后枚举能与此药水合成药水的药水,用找到的药水与配对的药水更新合成药水的最小值
至于方案数,有两种情况,
1:两个原料药水合成的药水的原本最小花费等于原料药水的总花费,那么合成药水的方案数就需要在原本的基础上加上两个原料药水方案的乘积
2:两个原料药水合成的药水的原本最小花费小于原料药水的总花费,那么合成药水的方案数就等于两个原料药水方案的乘积
然后输出就行了!
顺便吐槽一下,题目上没有数据范围,害我RE了一次!
#include <cstdio>#include <iostream>using namespace std;int cost[9999],ans[9999];int soc[3000][3000];bool f[3000];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&cost[i]),ans[i]=1; int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) soc[a+1][b+1]=soc[b+1][a+1]=c+1; for(int i=1;i<n;i++) { int maxn=0x7fffffff; for(int j=1;j<=n;j++) if(!f[j]&&cost[j]<maxn) b=j,maxn=cost[j]; f[b]=1; for(int j=1;j<=n;j++) if(f[j]&&soc[b][j]) { if(cost[b]+cost[j]==cost[soc[b][j]]) ans[soc[b][j]]+=ans[b]*ans[j]; if(cost[b]+cost[j]<cost[soc[b][j]]) cost[soc[b][j]]=cost[b]+cost[j],ans[soc[b][j]]=ans[b]*ans[j]; } } printf("%d %d",cost[1],ans[1]); return 0;}
阅读全文
1 0
- 佳佳的魔法药水
- vijosP1285 佳佳的魔法药水
- 洛谷 P1875 佳佳的魔法药水
- 洛谷 1875 佳佳的魔法药水
- NDK 1408 佳佳的魔法药水(Magic Syrup)
- 【Vijos-P1285】佳佳的魔法药水-Dijkstra思想
- 【vijos】【树形dp】佳佳的魔法药水
- 佳佳的魔法药水(好题,不过很神)
- 魔法药水图标设计教程
- 佳佳的魔法照片
- 佳佳的魔法照片
- 斯内普的药水阵
- [Vijos]P1282 佳佳的魔法照片
- PID9 / 佳佳的魔法照片 ☆
- vijosP1282 佳佳的魔法照片
- 佳佳的魔法照片-ssl 1255
- 洛谷1583 佳佳的魔法照片
- SSL P1255 佳佳的魔法照片
- redis清空数据
- 使用javaMail进行腾讯,新浪,网易网上邮箱验证
- DNS服务器
- HDU 6068 Classic Quotation(kmp+dp)
- 初识nodejs6
- 佳佳的魔法药水
- spring添加junit测试
- Git基础命令
- (POJ
- ARM时钟寄存器配置之分频配置
- OpenCV——图片的加载、显示、保存(python)
- Curling 2.0
- SPX Instant Screen Capture 7.0 汉化已授权版
- 1184: 平面点排序(二)(结构体专题)