题目链接:http://codeforces.com/contest/1117/problem/C
题目大意:你是一艘船的船长。最初你站在一个点上(x1,y1) 并且你想要前往一个点 (x2,y2)。明天都有一个风向,并且风向是周期性的。使你移动一个单位坐标。该船也可以是往四个方向中的一个移动一个单位或每天留在原地。您的任务是确定船舶到达该点所需的最少天数 。如果不能到达输出-1。
思路:
二分可行性验证:
因为n天能够到达,那么n+1天也一定能够到达(抵消n+1天的风向)。
判断能否到达时:
可支配天数>(X终点-(X起点+X风向的移动)+Y终点-(Y起点+Y风向的移动))
因为这个地方不要求差为偶数,因为船可以不移动。
如果船必须移动,那么差必须为偶数。参考另外我的一篇博客:
https://blog.csdn.net/qq_21433411/article/details/84180212
#include<bits/stdc++.h>
#define LL long long
//#define p1 first
//#define p2 second
using namespace std;
const int mod=1e9+7;
//memset(a, 0, sizeof(a));
//next(p, 1), prev(p, 1), set<int>::iterator
//stack堆栈 queue队列 priority_queue优先队列
//vector向量 multiset平衡二叉树 deque双端队列
//pair{T1 first;T2 second;} greater<T>
//unordered_map 哈希map
char s[100005];
int e[100005][2]={0};
int main()
{
LL a, b, c, d;
scanf("%lld%lld",&a,&b);
scanf("%lld%lld",&c,&d);
LL T;
scanf("%lld",&T);
scanf("%s",s+1);
for(int i=1;i<=T;i++)
{
e[i][0]=e[i-1][0];
e[i][1]=e[i-1][1];
if(s[i]=='U')
{
e[i][1]++;
}
if(s[i]=='D')
{
e[i][1]--;
}
if(s[i]=='L')
{
e[i][0]--;
}
if(s[i]=='R')
{
e[i][0]++;
}
}
LL L=1, R=1e18, key=-1;
while(L<=R)
{
LL mid=(L+R)/2;
LL x=a+(mid/T)*(e[T][0])+e[(mid%T)][0];
LL y=b+(mid/T)*(e[T][1])+e[(mid%T)][1];
if(mid>=abs(c-x)+abs(d-y))
{
R=mid-1, key=mid;
}
else
{
L=mid+1;
}
}
cout<<key<<endl;
return 0;
}