P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)
2017-07-01 20:10
183 查看
题目描述
汤姆斯生活在一个等级为0的星球上。那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为N的星球上天堂般的生活。有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱。
汤姆斯预先知道了从0等级星球去N等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线。
输入输出格式
输入格式:第一行一个正整数N(N≤100),接下来的数据可分为N个段落每段的第一行一个整数Ki(Ki≤100),表示等级为i的星球有Ki个。
接下来的Ki中第Tij行依次表示与等级为i,编号为i的星球相连的等级为i-l的星球的编号和此航线需要的费用(正数表示支出,负数表示收益,费用的绝对值不超过1000)。
每行以0结束,每行的航线数≤100。
输出格式:
输出所需(或所得)费用。正数表示支出,负数表示收益。
输入输出样例
输入样例#1:3 2 1 15 0 1 5 0 3 1 -5 2 10 0 1 3 0 2 40 0 2 1 1 2 5 3 -5 0 2 -19 3 -20 0
输出样例#1:
-1
说明
对于100%的数据N≤100 Ki≤100。样例解释:
用t数组表示上一层的状态,用d数组表示本层的状态
转移方程d[i]=min(d[i],t[k]+m)
然后再把t数组替换为d数组
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; void read(int &n) { char c='+';int x=0;bool flag=0; while(c<'0'||c>'9') {c=getchar();if(c=='-')flag=1;} while(c>='0'&&c<='9') {x=x*10+(c-48);c=getchar();} flag==1?n=-x:n=x; } int n,m; int a[10001]; int dp[10001][31]; int l,d[110],t[110]; int main() { int i,j,k; read(n); for (i=1;i<=n;i++) { read(k); for (j=1;j<=k;j++) { d[j]=0x7ffff; //将d[j]初始化 read(l); while (l!=0) { read(m); if (d[j]>t[l]+m) d[j]=t[l]+m; read(l); } } for (j=1;j<=k;j++) t[j]=d[j]; } int ans=1000000; for (i=1;i<=k;i++){ if (ans>d[i]) ans=d[i]; } printf("%d",ans); return 0; }
相关文章推荐
- 小明搬家_NOI导刊2010提高(05)
- 淘汰赛制(NOI导刊2010提高 01)
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
- P1800 software_NOI导刊2010提高(06)(二分答案)
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- [NOI导刊2010提高]黑匣子
- P1794 装备运输_NOI导刊2010提高(04)
- 洛谷1807 最长路 NOI导刊2010提高(07)
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- luoguP1774 最接近神的人_NOI导刊2010提高(02)x
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- P1774 最接近神的人_NOI导刊2010提高(02)
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- 洛谷P1771 方程的解_NOI导刊2010提高(01)
- 洛谷1801 黑匣子_NOI导刊2010提高(06) 【好题】
- 洛谷 P1799 数列_NOI导刊2010提高(06)
- NOI导刊2010提高(06) 黑匣子
- 洛谷 P1774 最接近神的人_NOI导刊2010提高(02)
- P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)
- P1799 数列_NOI导刊2010提高(06)