题目地址:

  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;
}