先把风吹的贡献弄成一个前缀和形式 (1<=i<=n)sumx[i] sumy[i]
然后二分天数t
先算风做出的贡献达到的坐标(X,Y)
然后算(X,Y)到终点的曼哈顿距离 如果小于t 向下二分 如果大于t向上二分 等于就是答案
为啥这样做呢?因为先算了风的贡献之后,ship相当于在无风的情况下行驶 所以如果距离小于t 我有t次的移动次数,所以我们早就到达了终点,所以向下二分
记得二分开大一点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int sumx[100005],sumy[100005];
char str[100005];
int sx,sy,ex,ey,n;
int main()
{
scanf("%d%d",&sx,&sy);
scanf("%d%d",&ex,&ey);
scanf("%d",&n);
scanf("%s",str+1);
for(int i=1;i<=n;i++)
{
if(str[i]=='U')
{
sumy[i]=sumy[i-1]+1;
sumx[i]=sumx[i-1];
}
if(str[i]=='D')
{
sumy[i]=sumy[i-1]-1;
sumx[i]=sumx[i-1];
}
if(str[i]=='L')
{
sumx[i]=sumx[i-1]-1;
sumy[i]=sumy[i-1];
}
if(str[i]=='R')
{
sumx[i]=sumx[i-1]+1;
sumy[i]=sumy[i-1];
}
}
//for(int i=1;i<=n;i++)
//cout<<sumy[i]<<endl;
ll l=0,r=1e18,ans=-1;
while(r>=l)
{
ll mid=(r+l)>>1;
if(mid>=(abs(sx+(mid/n)*(ll)sumx[n]+(ll)sumx[mid%n]-ex)+abs(sy+(mid/n)*(ll)sumy[n]+(ll)sumy[mid%n]-ey)))
{
r=mid-1;
ans=mid;
}
else
l=mid+1;
}
printf("%lld",ans);
}