二分专题 魔术船

题目链接: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;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务