时间就是金钱HNCOI2000(最短路)
时间就是金钱HNCOI2000
版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址!
人们总是选时间最短或费用最低的路线
例如,
|
出发地 |
目的地 |
开始时间 |
到达时间 |
费用 |
|
A |
B |
5:20 |
6:55 |
12.50 |
|
A |
C |
5:45 |
9:15 |
35.00 |
|
B |
C |
7:45 |
9:35 |
20.00 |
如果我们将从A到C,我们可以选择两条路径。
1.A->B->C 2.A->C。
前者时间为4:15,费用为32.50,后者是时间3:30,费用为35.00。
现为了综合考虑时间和费用的问题,我们常采用单位时间相当于多少费用的方法,来选择最低的旅游路线。我们假设:
(1) 旅游时间为最后1辆车的到达时间和第1辆车的出发时间之差
(2) 一小时旅游时间相当于费用10.00
(3) 时间采用24小时,格式为:HH:MM
(4) 旅游开始和结束时无等待时间,只有在转车的时候才有等待时间。如果等待时间超过12小时,将会因为住宿和误餐而多花费费用30.00
(5) 一个地点到另一个地点的直接车次可能有多个。例如,A到B可能有:同一时间出发的2种以上的车次,或者不同时间的2种以上的车次
(6) 任何车次的车票都是可买到的,任何车次的最长运行时间<=24小时
任务:根据旅行车次时间表和出发地、目的地,根据以上原则,求出最小的旅游费用
输入:输入文件若干行,第1行为2个城市名,分别是出发地和目的地,以后每一行为1辆车次的5个数据,分别是出发地,目的地,开始时间,到点时间,费用。数据之间用空格分开。城市数<=30,车次数<=2000
输出:输出文件为1行,即最低费用(四舍五入精确到小数后2位)。
样例:
Input.txt
A C
A B 5:20 6:55 12.50
A C 5:45 9:15 35.00
B C 7:45 9:35 20.00
Output.txt
70.00
测试数据
Input1:
B A
B C 20:00 22:00 09.20
B C 13:00 14:10 20.34
C A 14:30 16:00 39.95
Output1:
90.29
Input2:
A C
A B 06:30 07:00 12.50
A C 05:45 09:15 55.00
B C 07:45 09:35 40.00
A D 06:30 07:30 30.00
D C 09:00 11:30 10.00
B D 07:00 08:00 10.00
Output2:
82.50
Txt.3即样例
解题报告
很老的题目,比较经典(笑)
在生活中,赶车是来的早不如来的巧。这题也是一样,你也许选择了一辆耗时较少的车,但因为出发的比较早,最后到的时间是一样的,结果耗时比出发时间晚的车多。所以,把车的一趟线路作为一条边是不妥的。不过,我们转眼一想,不妨把一趟车作为一个点,如果一趟车的终点是另一趟车的起点,就可以连一条有向路径。这条路径的权值为这趟车本身的花费加上等到下一趟车所需的花费。因为可能有许多点的出发点为起点,许多点的结束点为终点,我们不知道取哪一个起点还是终点。故我们可以加一个起点到起点的点作为起点,与终点到终点的点作为终点。起点所连的边权值都为0,连向终点的边没有等待时间,只有前一个点本身的花费,这样处理就会方便很多。 还有,其实这题最好“金钱就是时间” 吧所有花费转换为 分钟 来计量,这样精度会高一点。
不知道为什么有一个测试点过不了,希望帮忙找找错。
#include<queue>
#include <algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define Pair pair<double,int>
#define MAXN 2000+10
#define MAX 99999999
#define MAXM 600000+1
using namespace std;
int n,m,num,nnum,head[MAXN],s,t,pre[MAXN],v[MAXN];
double dis[MAXN];
struct Node{
int from,to,st,tt;double dis;
}node[MAXN];
struct Edge{
int next,to,exi,from;
double dis,s,t,tim;
}edge[MAXM];
void add(int from,int to,double dis)
{
edge[++num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
edge[num].from=from;
head[from]=num;
}
double dist(int x,int y)
{
if(x==s) return ;
if(x==t) return MAX;
if(y==t) return node[x].dis;
int h=node[x].tt,g=node[y].st;
// printf("%d %d %lf\n",h,g,node[x].dis);
if(g<h) g+=*;
if(g-h>=*) return *+(g-h)%(*)+node[x].dis;
else return (g-h)%(*)+node[x].dis;
}
void dij()
{
for(int i=;i<=nnum;i++) dis[i]=;
memset(pre,,sizeof(pre));
memset(v,,sizeof(v));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
dis[s]=;
h.push(Pair(dis[s],s));
while(h.size()>)
{
int k=h.top().second;h.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
{
if(dis[k]*1.0+edge[i].dis*1.0<dis[edge[i].to])
{
dis[edge[i].to]=dis[k]*1.0+edge[i].dis*1.0;
pre[edge[i].to]=edge[i].from;
h.push(Pair(dis[edge[i].to],edge[i].to));
}
}
} } int main()
{
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
char ss[],tt[];
scanf("%s%s",ss,tt);
s=ss[]-'A'+;t=tt[]-'A'+;
while(scanf("%s%s",ss,tt)==)
{
int x,y,sh,sm,th,tm,tim;double mon;
scanf("%d:%d%d:%d%lf",&sh,&sm,&th,&tm,&mon);
x=ss[]-'A'+;y=tt[]-'A'+;n=max(n,max(x,y));
if(th==) th=;
sh=sh*+sm;th=th*+tm;
printf("sh=%d th=%d ",sh,th);
node[++nnum].st=sh;node[nnum].tt=th;
if(sh>th) th+=*;
tim=th-sh;
printf("%d %d \n",nnum,tim);
node[nnum].from=x;node[nnum].to=y;
node[nnum].dis=mon*6.0+tim*1.0;
}
node[++nnum].from=s;node[nnum].to=s;
node[nnum].dis=;
s=nnum;
node[++nnum].from=t;node[nnum].to=t;
node[nnum].dis=MAX;
t=nnum;
for(int i=;i<=nnum;i++)
{
for(int j=i+;j<=nnum;j++)
{
if(node[i].to==node[j].from)
add(i,j,dist(i,j));
else
if(node[j].to==node[i].from)
add(j,i,dist(j,i));
}
}
dij(); printf("%.2lf\n",dis[t]/6.0);
return ;
}
时间就是金钱HNCOI2000(最短路)的更多相关文章
- MyEclipse的真正价值——时间等于金钱
全世界成千上万的Java开发者选择MyEclipse作为首选的Eclipse IDE,甚至超过了著名的开发工具 IBM Rational和Eclipse Java. 为什么? 很简单,MyEclips ...
- struts2 全局格式化,格式化时间,金钱,数字
//在前台页面去控制时间,数字,小数,金钱,是极其不明智的选择,除非你是写了良好的 js api 像freemarker , struts 都有良好的标签,我们应该好好利用,才发现的,给大家分享一下 ...
- 时间、金钱在java、数据库中的变量类型之总结
在编写程序时,总是有些变量的类型搞不很明白,现将目前涉及到的变量总结一下: 1.“时间”类型 (1).在数据库中的变量类型是:DateTime 比如: operateTime DATETIME,//数 ...
- NUC_HomeWork1 -- POJ2067(最短路)
C - Fire Station Description A city is served by a number of fire stations. Some residents have comp ...
- F01:金融学第一定律:时间的价值
很小的时候,我们就听大人们讲过:时间就是金钱. 长大了,也觉得这句话应该是对的.我们很珍惜时间,但是似乎没有看到金钱的急剧增加啊.总之,这是模糊,体验感又不强的一句话. 既然谈到时间的价值,价值最容易 ...
- HDU 2544 最短路(模板题——Floyd算法)
题目: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你 ...
- 开发一款APP所需要的时间
"要多少钱""要多少时间"这应该是一个企业在打算开发一款APP时问到最多的问题了.的确,现在的人不管做什么事情都讲究计划,更何况在这个时间就是金钱的时代,企业如 ...
- BZOJ2200 道路和航线【好题】【dfs】【最短路】【缩点】
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1384 Solved: 508[Submit] ...
- Skiing(最短路)
poj——3037 Skiing Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4921 Accepted: 1315 ...
随机推荐
- python的装饰器,迭代器用法
装饰器. 装饰器实际就是一个函数 定义:在不改变内部代码和调用方式的基础上增加新的功能 了解装饰器需要了解3个内容: 1.函数即变量 2.高阶函数 1).把一个函数名当作实参传给另一个函数 2).返回 ...
- cmake模板
1.主要命令 project (TEST):指定项目名称为TEST aux_source_directory(<dir> <variable>):将当前目录中的源文件名称赋值给 ...
- Java String 字符串截取和获取文件的上级目录
public String test() { String root = ServletActionContext.getServletContext().getRealPath("/&qu ...
- S3C6410 LCD Overlay Test Program
测试了一下S3C6410 LCD控制器提供的Overlay功能,写了一个简单的test,主要用于实现FB0和FB1之间的Overlay操作.内核选项的Windows至少要为2. 具体支持如下操作:1 ...
- Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password
在配置JMX远程访问的时候,设置jmxremote.password文件权限,修改该文件时添加写权限,chmod +w jmxremote.password ,放开角色信息那俩行的注释,保存,再使用c ...
- ASP.NET-使用json
数据格式 vat strJson =' {"name":"jingya","Age":88} '; // 数字不用写双引号 JSON.par ...
- POJ 2183
模拟题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std ...
- csdn第五届在线编程大赛-全然平方
题目详情 给定整数区间[A,B]问当中有多少个全然平方数. 输入格式: 多组数据,包括两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包括一个 ...
- 图片3d轮放查看效果
本功能比較简单,就是一个大幕.左右滚动播放图片. 关键点在于怎样实现平滑的滚动,包含动画效果,3d效果等. <style> img { position: absolute; top:20 ...
- node15---cookie session
二.Cookie和Session 2.1 Cookie ● HTTP是无状态协议.简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到,这是同一个浏览器在访问同一个网站.每一 ...