概述
Problem Link
Description
给定
K
,
Solution
我们令
w=2∗min(d1,2,d2,3)
,即从2出发再返回2的最短路径。 然后我们开始跑最短路,定义
dis[i][j]
表示到达
i
点,路程模
Code
#include<queue>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define M 60005
#define ll long long
using namespace std;
template <class T>
inline void Rd(T &res){
char c;res=0;int k=1;
while(c=getchar(),c<48&&c!='-');
if(c=='-'){k=-1;c='0';}
do{
res=(res<<3)+(res<<1)+(c^48);
}while(c=getchar(),c>=48);
res*=k;
}
template <class T>
inline void Pt(T res){
if(res<0){
putchar('-');
res=-res;
}
if(res>=10)Pt(res/10);
putchar(res%10+48);
}
struct node{
int v;
ll dis;
bool operator <(const node &tmp)const{
return dis>tmp.dis;
}
}G[4][2];
int T;
ll k,ans,dis[4][M];
int w,d[4];
int u[]={-1,1};
void calc(int x){
ans=min(ans,(k-x+w-1)/w*w+x);
}
void Dijkstra(){
priority_queue<node>que;
dis[1][0]=0;
que.push((node){1,0});
while(!que.empty()){
node q=que.top();que.pop();
int u=q.v;
ll d=q.dis;
if(dis[u][d%w]!=d)continue;
for(int i=0;i<2;i++){
node nxt=G[u][i];
nxt.dis+=d;
ll tmp=dis[nxt.v][nxt.dis%w];
if(tmp==-1||tmp>nxt.dis){
dis[nxt.v][nxt.dis%w]=nxt.dis;
if(nxt.dis>=k){
if(nxt.v==1)ans=min(ans,nxt.dis);
continue;
}
if(nxt.v==1)calc(nxt.dis%w);
que.push(nxt);
}
}
}
}
int main(){
Rd(T);
while(T--){
memset(dis,-1,sizeof(dis));
Rd(k);
for(int i=0;i<4;i++)Rd(d[i]);
w=min(d[0],d[1])<<1;
ans=(k+w-1)/w*w;
for(int i=0;i<4;i++)
for(int j=0;j<2;j++){
int t=(i+u[j])%4;
if(t<0)t+=4;
if(j)G[i][j]=(node){t,d[i]};
else G[i][j]=(node){t,d[t]};
}
Dijkstra();
Pt(ans);
putchar('n');
}
return 0;
}
这题用了同余的思想,就是对于同余的
最后
以上就是寂寞枕头为你收集整理的[HDU6071] Lazy Running的全部内容,希望文章能够帮你解决[HDU6071] Lazy Running所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复