ACM 222. [POI1997] 便宜的旅行(dp)
来源:互联网 发布:跳跃网络次元大作战 编辑:程序博客网 时间:2024/04/30 04:20
222. [POI1997] 便宜的旅行
★☆ 输入文件:tan.in
输出文件:tan.out
简单对比时间限制:1 s 内存限制:128 MB
坐马车来进行横穿大陆的旅行一般都要花去几天的时间,所以路上在旅馆的住宿费用是很大的一笔开销。为了使旅行的安全和舒适,人们只在白天赶路,并且每天最多只能走800公里。在旅途中时,车夫和旅客们都是在旅馆中度过晚上的(不包括起点和终点)。现在我们想要尽可能的减少在路上的开销,就是在旅馆中的住宿费用(即使增加了花在路上的时间也无所谓)。由于旅行是在一条高速公路上进行的,所以旅途是单向并且没有分叉的,也就是马车只经过路上的每个点一次。现给出每个旅馆距离起点的距离和一个人(包括车夫和旅客)在旅馆住一个晚上的费用。我们假设在路上的每个点最多都只能有一个旅馆,在起点和终点的住宿是不用花费的。并且保证每800公里必然有一个旅馆,也就是说,这样的旅行必然是可以实现的。
任务
请写一个程序
在文本文件中读入路程的总长度、旅馆的数目和对旅馆的描述;
找出两个旅行的方案:
一个最便宜的方案(就是付出的宿费最少的方案);如果有多个方案,选择在旅馆中度夜的次数最少的方案;
一个最短的方案(就是在旅馆中度夜的次数最少的方案);如果有多个方案,选择花费最少的方案;
把结果,就是两个旅行方案,最便宜和最短的旅行方案,输出到文件中。
输入格式:
在文本文件的第一行包括两个用空格分开的正整数。第一个整数d为从起点到终点的距离,第二个整数h为旅馆的数目,d <= 16000,h <= 1000。以下的h行每行两个整数,为对旅馆的描述。每行中的第一个整数为旅馆距离起点的距离,第二个为旅馆的住宿费用,为不大于1000的整数。数据是按照据起点距离递增的顺序排列的。
输出格式:
你应该在文本文件中输出最便宜的旅程方案。也就是说,从起点开始需要过夜的旅馆距离起点的距离。类似的,你应该在文件的第二行输出最短的旅程方案。所有的整数应该的用空格分开。
样例:
输入
2000 7
100 54
120 70
400 17
700 38
1000 25
1200 18
1440 40
输出
400 1200
400 1200
相容动态规划(mincost[a]+cost<mincost[b])
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define INF 99999999#define MAX_DIS 800#define MAX_H 1002int d,h;int cost[MAX_H],times[MAX_H];int dist[MAX_H],price[MAX_H];int pre[MAX_H];int main(){freopen("tan.in","r",stdin);freopen("tan.out","w",stdout);scanf("%d%d",&d,&h);for(int i=1;i<=h;i++) scanf("%d%d",&dist[i],&price[i]);dist[h+1]=d;price[h+1]=0;for(int i=1;i<=h+1;i++){cost[i]=INF;times[i]=INF;}for(int i=1;i<=h+1;i++){for(int j=i-1;j>=0 && dist[i]-dist[j]<=MAX_DIS;j--){if(cost[j]+price[i]<cost[i] || (cost[j]+price[i]==cost[i] && times[j]+1<times[i])){cost[i]=cost[j]+price[i];times[i]=times[j]+1;pre[i]=j;}}}int cnt;int ans[MAX_H];cnt=0;for(int i=h+1;pre[i];i=pre[i]){ans[cnt++]=pre[i];}for(int i=cnt-1;i>=0;i--){printf("%d ",dist[ans[i]]);}printf("\n");for(int i=1;i<=h+1;i++){cost[i]=INF;times[i]=INF;}for(int i=1;i<=h+1;i++){for(int j=i-1;j>=0 && dist[i]-dist[j]<=MAX_DIS;j--){if(times[j]+1<times[i] || (times[j]+1==times[i] && cost[j]+price[i]<cost[i])){cost[i]=cost[j]+price[i];times[i]=times[j]+1;pre[i]=j;}}}cnt=0;for(int i=h+1;pre[i];i=pre[i]){ans[cnt++]=pre[i];}for(int i=cnt-1;i>=0;i--){printf("%d ",dist[ans[i]]);}printf("\n");return 0;}
- ACM 222. [POI1997] 便宜的旅行(dp)
- 是不是超级便宜的旅行!
- ACM 227. [POI1997] 阿里巴巴(BFS)
- acm-独木舟上的旅行
- ACM HDOJ 2066 (一个人的旅行)
- HDU ACM 2233 机器人的旅行
- ACM:蓝桥杯:独木舟上的旅行
- HDU ACM 11 2066 一个人的旅行
- 南工ACM:独木舟上的旅行
- 南阳ACM-独木舟上的旅行
- [DP 压位] BZOJ 2915 [Poi1997] gen Genotypes
- acm-星际旅行
- C语言 南阳理工 ACM 71 独木舟上的旅行
- ACM->dijkstra + heap + stl 一个人的旅行 hdu 2066
- ACM-最短路之一个人的旅行——hdu2066
- ACM 95. [NOIP2001] Car的旅行路线(最短路)
- 南阳ACM 题目71:独木舟上的旅行 Java版
- 好便宜的电脑
- myeclipse 项目报错
- 如何在同一台电脑使用不同的账号提交到同一个github仓库
- random python
- 2048
- spring组件扫描<context:component-scan/>使用详解 .
- ACM 222. [POI1997] 便宜的旅行(dp)
- 【Android】 RGB颜色对照表
- poj 2229 Ultra-QuickSort(树状数组)
- HDU 4067 Random Maze
- Android 快速开发系列 打造万能的ListView GridView 适配器
- zedboard上移植OPENCV库
- Spring事务的架构 .
- 测试用例实例--常见功能测试点
- poj 2251(广搜求两点之间的距离)