https://codeforces.com/contest/1117/problem/C

你是一个船长。最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2,y2) 。

你看了天气预报——一个长为 n 的字符串 s,只包含字母 U, D, L 和 R 。这些字母表示风向。并且,这个天气预报是循环的。例如,第一天风向是 s1 ,第二天是 s2 ,第 n 天是 sn ,则第 n+1 天又是 s1 ,以此类推。

船的坐标按照如下方式改变:

如果风向是 U ,船从 (x,y) 到 (x,y+1) ;

如果风向是 D ,船从 (x,y) 到 (x,y−1) ;

如果风向是 L ,船从 (x,y) 到 (x−1,y) ;

如果风向是 R ,船从 (x,y) 到 (x+1,y) 。

每天,船也能自己向如上四个方向中的一个移动恰好 1 个单位或待在原地。船的位移与风向会相加。如果船待在原地,则只计算风向对船的影响。例如,如果风向是 U ,船向 L 移动,则它会从 (x,y) 移动到 (x−1,y+1) ;如果船向 U 移动,则它会移动到 (x,y+2) 。

你的任务是确定移动到 (x2,y2) 所需的最少天数。

输入
第一行包含两个整数 x1,y1 (0≤x1,y1≤1e9) ——船的初始坐标。

第二行包含两个整数 x2,y2 (0≤x2,y2≤1e9) ——目的地的坐标。

保证初始坐标与目的地的坐标不同。

第三行包含一个整数 n (1≤n≤105) ——字符串 s 的长度。

第四行包含字符串 s ,只包含字母 U, D, L 和 R 。

输出
输出一行,移动到 (x2,y2) 所需的最少天数。

如果不可能输出 −1 。

分析:这里有条不明显的递增规律 , 因为到达终点后每天都往与当天风向相反的方向航行就可以停留在原地,就是说可以第x天到达目的地 , 那还可以在比x天更小的天到达目的地。

所以我们可以二分mid天可以到达目的地 ; 现在再来考虑一个问题 , 我们怎么考虑风向的影响 , 既然我们是考虑是mid天到达目的地 ,那在这个mid天里面 , 无论是在那个位置受到的风向的价值都是一样的 ,不会改变 , 所以我们可以考虑 , 把风向的价值与人自己决定的价值分开来计算, 比如一开始我们先不人为走, 只让风吹你走 , 然后可以到达某个位置 , 在判断在这个位置可不可以小于等于mid 步到达 ;

注意:因为风向是周期性 的 , 所以需要一些前缀和操作来o(1) 找到价值

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
int stx,sty,enx,eny;
int dx[],dy[];
string str;
bool solve(ll mid)
{
ll a=mid/n;
ll b=mid%n; ll x=a*dx[n] + dx[b] + stx;///天气是循环的
ll y=a*dy[n] + dy[b] + sty;
ll res=abs(x-enx) + abs(y-eny);///曼哈顿距离求所够的天数
return res<=mid;
}
int main()
{
cin>>stx>>sty>>enx>>eny>>n>>str; for(int i= ; i< n; i ++)
{
dy[i+] = dy[i];
dx[i+] = dx[i]; if(str[i]=='U') dy[i+]++;
if(str[i]=='D') dy[i+]--;
if(str[i]=='L') dx[i+]--;
if(str[i]=='R') dx[i+]++;
}
ll head= , tail=1e18,ans=-,mid;
while(head<=tail)
{
mid=(head+tail) >>;
if(solve(mid))
{
tail=mid-;
ans=mid;
}
else
{
head=mid +;
}
}
printf("%lld\n",ans);
}

C. Magic Ship (思维+二分)的更多相关文章

  1. C. Magic Ship cf 二分

    C. Magic Ship time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  3. CF1117C Magic Ship

    CF1117C Magic Ship 考虑到答案具单调性(若第 \(i\) 天能到达目的点,第 \(i+1\) 天只需向风向相反的方向航行),可以二分答案. 现在要考虑给出一个天数 \(m\) ,问 ...

  4. 题解-Magic Ship

    Magic Ship 你在 \((x_1,y_1)\),要到点 \((x_2,y_2)\).风向周期为 \(n\),一个字符串 \(s\{n\}\) 表示风向(每轮上下左右),每轮你都会被风向吹走一格 ...

  5. CodeForces 1117C Magic Ship (循环节+二分答案)

    <题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...

  6. Codeforces 1117C Magic Ship (二分)

    题意: 船在一个坐标,目的地在一个坐标,每天会有一个风向将船刮一个单位,船也可以移动一个单位或不动,问最少几天可以到目的地 思路: 二分天数,对于第k天 可以分解成船先被吹了k天,到达坐标(x1+su ...

  7. Educational Codeforces Round 60 C 思维 + 二分

    https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...

  8. codeforces 350 div2 D Magic Powder - 2 二分

    D2. Magic Powder - 2 time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. Codeforces Round #350 (Div. 2) D1. Magic Powder - 1 二分

    D1. Magic Powder - 1 题目连接: http://www.codeforces.com/contest/670/problem/D1 Description This problem ...

随机推荐

  1. Python 安装urllib3

    一.系统环境 操作系统:Win10 64位 Python版本:Python 3.7.0 二.报错信息 No module named 'urllib3' 三.安装参考 1.参照网上的安装方法通过pip ...

  2. 关闭是否只查看安全传送的网页内容提示框 和 是否允许运行软件,如ActiveX控件和插件提示框

    关闭是否只查看安全传送的网页内容提示框 最新编写 爬虫程序,运行程序后,电脑就总是出现下面这个提示框,一遍遍点"是"或"否"繁琐又麻烦.我看得有点不耐烦了.于是 ...

  3. PCL 编译中遇到 error C4996: 'pcl::SAC_SAMPLE_SIZE'

    1. error C4996: 'pcl::SAC_SAMPLE_SIZE': This map is deprecated and is kept only to prevent breaking ...

  4. c# 多维数组、交错数组(转化为DataTable)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. inux内核的编译与安装 (转)

    1.查看ubuntu版本号: xdj@xdj-MS-:~$ sudo lsb_release -a [sudo] password for xdj: No LSB modules are availa ...

  6. js实现选项卡切换

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  7. 2.3.2 volatile 说明

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  8. 煤球数目——第七届蓝桥杯C语言B组(省赛)第一题

    原创 煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球? 请填 ...

  9. 【C#】is 和 as

    看个例子: public class User { } public class Group { } class Program { static void Main(string[] args) { ...

  10. Backbone.js 0.9.2 中文解释

    // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely ...