本题分析可知每天风向加自主航行可保证船不远离目标。可以知道最大天数应为m*(x1+y1),如果这些天不能抵达目的地则为永远不能到达,可以将本题转化为二分法查找类问题,用二分法查找找到可以到达目的地坐标的最小的天数即可,算法复杂度为O(log(mx))。
ac代码:
#include <bits/stdc++.h>
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair<int,int>
#define ll long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
string s;
int d[100005][2];
int x,y;
ll x2,y2;
ll n;
bool jd(ll a){
ll t1=a/n;
ll t2=a%n;
ll px=abs(x2-x*t1-d[t2][0]);
ll py=abs(y2-y*t1-d[t2][1]);
return a>=(px+py);
}
int main()
{
int x1,y1;
cin>>x1>>y1>>x2>>y2>>n>>s;
x2-=x1;
y2-=y1;
FOR(i,0,n){
if(s[i]=='U'){
d[i+1][0]=d[i][0];
d[i+1][1]=d[i][1]+1;
}
else if(s[i]=='D'){
d[i+1][0]=d[i][0];
d[i+1][1]=d[i][1]-1;
}
else if(s[i]=='R'){
d[i+1][1]=d[i][1];
d[i+1][0]=d[i][0]+1;
}
else if(s[i]=='L'){
d[i+1][1]=d[i][1];
d[i+1][0]=d[i][0]-1;
}
}
x=d[n][0];
y=d[n][1];
ll l=0;
ll r=n*(abs(x2)+abs(y2));
while(l<=r){
ll m=(l+r)/2;
if(jd(m)) r=m-1;
else l=m+1;
}
if(jd(l)) printf("%lld\n",l);
else printf("-1\n");
return 0;
}