九度OJ 1086 最小花费
来源:互联网 发布:郑州seo网络优化公司 编辑:程序博客网 时间:2024/06/16 01:28
- 题目描述:
- 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下:距离s 票价0<S<=L1 C1L1<S<=L2 C2L2<S<=L3 C3输入保证0<L1<L2<L3<10^9,0<C1<C2<C3<10^9。每两个站之间的距离不超过L3。当乘客要移动的两个站的距离大于L3的时候,可以选择从中间一个站下车,然后买票再上车,所以乘客整个过程中至少会买两张票。现在给你一个 L1,L2,L3,C1,C2,C3。然后是A B的值,其分别为乘客旅程的起始站和终点站。然后输入N,N为该线路上的总的火车站数目,然后输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。根据输入,输出乘客从A到B站的最小花费。
- 输入:
- 以如下格式输入数据:L1 L2 L3 C1 C2 C3A BNa[2]a[3]……a[N]
- 输出:
- 可能有多组测试数据,对于每一组数据,根据输入,输出乘客从A到B站的最小花费。
- 样例输入:
1 2 3 1 2 31 222
- 样例输出:
2
需要注意两站之间距离可能为0
/***** dijkstra解法 *****/#include <stdio.h>#include <string.h> #define INF 9999999999 long long int L1,L2,L3,C1,C2,C3,A,B,N; long long int G[200][200];long long int cost(long long int L){ if(L >= 0 && L <= L1) return C1; else if(L <= L2) return C2; else if(L <= L3) return C3; else return INF;}int main(){ //freopen("Test.txt","r",stdin); while(scanf("%lld%lld%lld%lld%lld%lld",&L1,&L2,&L3,&C1,&C2,&C3) != EOF) { scanf("%lld%lld",&A,&B); scanf("%lld",&N); if(A == B) { printf("0\n"); continue; } long long int a[1000]; a[1] = 0; int i, j, k; for(i = 2; i <= N; i++) scanf("%lld",&a[i]); for(i = 1; i <= N; i++) { for(j = i; j <= N; j++) { if(i == j) G[i][j] = 0; else G[i][j] = G[j][i] = cost(a[j] - a[i]); } } /* for(i = 1; i <= N; i++) { for(j = 1; j <= N; j++) printf("%lld ",G[i][j]); printf("\n"); } */ long long int dist[1000]; int mark[1000]; for(i = 1; i <= N; i++) { dist[i] = G[A][i]; mark[i] = 0; } mark[A] = 1; int newP = A; for(j = 1; j < N; j++) { for(i = 1; i <= N; i++) { if(G[newP][i] == INF) continue; if(mark[i] == 1) continue; if(dist[i] > dist[newP] + G[newP][i]) { dist[i] = dist[newP] + G[newP][i]; } } long long int min = INF; for(i = 1; i <= N; i++) { if(mark[i] == 0 && dist[i] < min) { min = dist[i]; newP = i; } } mark[newP] = 1; //printf("%d\n",newP); } printf("%lld\n",dist[B]); } return 0;}
/*** DP解法 ***/#include <stdio.h> long long l1,l2,l3,c1,c2,c3,A,B,N,i,j;long long len1[1000], len[1000], ans[1000]; int main(){ //freopen("Test.txt","r",stdin); while(scanf("%lld%lld%lld%lld%lld%lld",&l1,&l2,&l3,&c1,&c2,&c3) != EOF) { scanf("%lld%lld%lld",&A,&B,&N); len1[1] = len[1] = 0; for(i = 2; i <= N; i++) { scanf("%lld",&len1[i]); len[i] = len1[i] - len1[i-1]; } if(A > B) { long long temp = A; A = B; B = temp; } ans[A] = 0; for(i = A+1; i <= B; i++) { long long sum = 0, min = ans[i-1] + c3, tmp; for(j = i-1; j >= A; j--) { sum += len[j+1]; if(sum >= 0 && sum <= l1) tmp = ans[j] + c1; else if(sum > l1 && sum <= l2) tmp = ans[j] + c2; else if(sum > l2 && sum <= l3) tmp = ans[j] + c3; else break; if(tmp < min) min = tmp; } ans[i] = min; } printf("%lld\n",ans[B]); } return 0;}
0 0
- 九度OJ 1086 最小花费
- 九度OJ 题目1086:最小花费
- 九度 oj 题目1086:最小花费
- 九度OJ 1086 最小花费--动态规划
- 九度OJ 1086 清华大学2011年机试 《最小花费》
- 九度OJ 1086:最小花费 (DP)
- 九度OJ 1086 动态规划之《最小花费》——11年清华机试真题
- 题目1086:最小花费
- 题目1086:最小花费
- 题目1086:最小花费
- 华为oj 字符串变换最小花费
- 九度OJ 题目1020:最小长方形
- 九度OJ 1209: 最小邮票数
- 九度oj-1020-最小长方形
- 九度OJ 1170 找最小数
- 九度OJ题目1020:最小长方形
- 九度OJ-题目1020:最小长方形
- 九度 OJ 1020:最小长方形
- 建立专门的链表类处理有关动态链表的操作
- Java编程中“为了性能”需做的26件事
- 【论文笔记】Mid-level Visual Element Discovery as Discriminative Mode Seeking
- 2014寒假 生活
- 操作系统的基本功能
- 九度OJ 1086 最小花费
- Qt中关于 Char* to QString
- UTF-8页面引用外部编码为GBK的JS文件编码的处理
- JSTL标签split属性
- .AppException: android.view.ViewRootImpl$CalledFromWrongThreadException: Only t
- Windows下Subversion和TortoiseSVN构建SVN版本控制
- vmware中挂载U盘
- hdu 1421 搬寝室
- EditPlus 应用