题目地址:
http://codeforces.com/contest/1117/problem/C
题意:
小明是个船长,他起始位置 ( x1 , y1 ) ;他想去 (x2 , y2);
风在海上吹啊吹,给一个长度为 $n$ 的字符串,由 U, D,L,R 组成,表示风向,风可以无限挂,但是按照字符串循环。
你一天肯定被风吹移动一单位,你又可以自主移动一单位或者不动,若是小明选择不动则只看风的影响就可以。
问:最短几天可以到达,不能则输出 -1 ;
必要思考:
1,无论风怎么吹,你都可以向相反方向行驶,使自己不动,也就是说:到达后你仍然可以停留在原地。
2,风的作用一定存在,而你可行驶的距离小于等于天数。
3,由于到达后可以停在原地,最短到达天数后的天数依然可以到达,顾可以二分答案,from 0 ~ 1e18;
4,由于风按照周期吹,先看 mid 需要及周期.....,顾需要 x , y 方向的风的影响的前缀和 dx[ ] , dy[ ] 。
代码:
//#include <bits/stdc++.h> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> using namespace std; const long long inf = 1e18+7; const int N=100000+7; int dx[N]; int dy[N]; int x1,x2,y11,y2,len; bool ok(long long po) { long long zq=po/len; long long xx=dx[len]*zq+dx[po%len]; long long yy=dy[len]*zq+dy[po%len]; long long dis=abs(x1-x2+xx)+abs(y11-y2+yy); return po>=dis; } int main() { //ios::sync_with_stdio(false); memset(dx,0,sizeof(dx));memset(dy,0,sizeof(dy)); string s; cin>>x1>>y11>>x2>>y2>>len>>s; for(int i=0;i<len;i++) { if(s[i]=='U'){ dy[i+1]=1; } else if(s[i]=='D') { dy[i+1]=-1; } else if(s[i]=='L') { dx[i+1]=-1; } else{ dx[i+1]=1; } dy[i+1]+=dy[i]; dx[i+1]+=dx[i]; } long long l=0;long long r=(long long)inf; while(l<=r) { long long mid=(r+l)/2; if(ok(mid)) r=mid-1; else l=mid+1; } if(l>=inf) cout<<-1<<endl; else cout<<l<<endl;return 0; }
浙公网安备 33010602011771号