2017多校训练赛第四场 HDU 6071(最短路)
来源:互联网 发布:云计算与大数据 idc 编辑:程序博客网 时间:2024/06/06 10:19
Lazy Running
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 101 Accepted Submission(s): 40
Problem Description
In HDU, you have to run along the campus for 24 times, or you will fail in PE. According to the rule, you must keep your speed, and your running distance should not be less than
There are
The system regards these
Checkpoint
Input
The first line of the input contains an integer
In each test case, there are
Output
For each test case, print a single line containing an integer, denoting the minimum distance.
Sample Input
12000 600 650 535 380
Sample Output
2165HintThe best path is 2-1-4-3-2.
Source
2017 Multi-University Training Contest - Team 4
比赛的时候就是蠢……
当时只剩下十几分钟的时候看到这题的……其实很简单的一道最短路,前提是想到了……
题目要求是只有四个点,然后连边成正方形,问从2号点出发,再回到2号点且走过的总距离大于K的最短的路径是多少。对于这个,我们考虑如果存在一条合法路径,那么我再走2*w也一定是合法路径,其中w表示与2相连的某条边的长度。即回到2之后再出去再回来,这样的路径一定合法。那么,如果走了某条路径回到了2,然后总距离不够的话,我们只需要加上几个2*w使得最后结果大于等于K即可。
那么如何使这个结果最小呢?我们考虑设置一个数组d[x][p]表示从2出发最后到达x点且费用对2*w取模结果为p时的最小花费。这样子原本的一个点就可以拆成2*w个点,这样跑一遍dijkstra即可求出d数组。之后,对于每一个对2*w取模后的数值,我们都可以计算把它补到大于K且距离K最近的花费,再在这些花费中取一个最小的即可。那么,这样子考虑为什么可以包含全部的而且最优的解呢?因为我们最后补的是2*w或者它的倍数,然后我把对2*w取模后的所有取值的最小花费都计算了一次,这样子得出来的最小花费一定包含所有的情况,即2*w的所有剩余系都被包括了,所以可以保证正确性。具体代码如下:
#include<bits/stdc++.h>#define LL long longusing namespace std;struct Edge{int y;LL w;};typedef pair<LL,int> P;vector<Edge> g[4];LL d[4][100000],K,m;int n,s;inline void dijkstra(int s){ priority_queue<P,vector<P>,greater<P> > q; for(int i=0;i<n;i++) for(int j=0;j<=m;j++) d[i][j]=2000000000000000000; q.push(P(0LL,s));//d[s][0]不能赋值为0 while (!q.empty()) { LL w=q.top().first; int j=q.top().second; q.pop(); if (w>d[j][w%m]) continue; for(int k=0;k<g[j].size();k++) { int y=g[j][k].y; LL dist=w+g[j][k].w; if (d[y][dist%m]>dist)//更新的时候更新取模后对应的点 { d[y][dist%m]=dist; q.push(P(dist,y)); } } }}int main(){ n=4; s=1; int T_T; cin>>T_T; while(T_T--) { int d1,d2,d3,d4; memset(g,0,sizeof(g)); scanf("%I64d%d%d%d%d",&K,&d1,&d2,&d3,&d4); g[0].push_back(Edge{1,d1}); g[1].push_back(Edge{0,d1}); g[1].push_back(Edge{2,d2}); g[2].push_back(Edge{1,d2}); g[2].push_back(Edge{3,d3}); g[3].push_back(Edge{2,d3}); g[3].push_back(Edge{0,d4}); g[0].push_back(Edge{3,d4}); m=2*min(d1,d2);//为了使效率更高,w取两条与2相连的边中小的那个 dijkstra(s); LL ans=2000000000000000000; int p; for(int i=0;i<m;i++)//枚举剩余系下所有的可能的最小花费 { LL delta=K-d[1][i]; if (delta<=0) ans=min(ans,d[1][i]); else ans=min(ans,d[1][i]+delta/m*m+(delta%m>0)*m); } printf("%I64d\n",ans); } return 0;}
- 2017多校训练赛第四场 HDU 6071(最短路)
- (2017多校训练第四场)HDU
- (2017多校训练第四场)HDU
- 2017多校训练赛第四场 HDU 6070(二分答案+线段树+扫描线)
- 2017多校训练赛第四场 HDU 6078 Wavel Sequence(dp+优化)
- 2017 多校训练第四场 HDU 6069 Counting Divisors
- HDU 6166 && 2017 多校训练:Senior Pan(最短路)
- (2017多校训练第一场)HDU
- (2017多校训练第一场)HDU
- (2017多校训练第一场)HDU
- (2017多校训练第二场)HDU
- (2017多校训练第二场)HDU
- (2017多校训练第二场)HDU
- (2017多校训练第二场)HDU
- (2017多校训练第三场)HDU
- (2017多校训练第三场)HDU
- (2017多校训练第三场)HDU
- (2017多校训练第二场)HDU
- 数据库连接字符串的处理方法!加密解密连接字符串。
- signalr 官方文档地址讲解最全面
- 冒泡排序 鸡尾酒排序
- 设计模式C++实现(1)——工厂模式
- java求一个整数的个位数
- 2017多校训练赛第四场 HDU 6071(最短路)
- 竞赛题目讲解-【Greater New York 2001】最大子矩阵
- 我是如何学会英语的
- jQuery中实现表格的增、删、改操作
- 泛型通配符
- 极大似然和交叉熵 | 深度学习
- leetcode(494). Target Sum
- ZCMU新人训练赛F
- SQLyog恢复数据库报错解决方法【Error Code: 2006