C. Magic Ship (思维+二分)
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 (思维+二分)的更多相关文章
- C. Magic Ship cf 二分
C. Magic Ship time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 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 ...
- CF1117C Magic Ship
CF1117C Magic Ship 考虑到答案具单调性(若第 \(i\) 天能到达目的点,第 \(i+1\) 天只需向风向相反的方向航行),可以二分答案. 现在要考虑给出一个天数 \(m\) ,问 ...
- 题解-Magic Ship
Magic Ship 你在 \((x_1,y_1)\),要到点 \((x_2,y_2)\).风向周期为 \(n\),一个字符串 \(s\{n\}\) 表示风向(每轮上下左右),每轮你都会被风向吹走一格 ...
- CodeForces 1117C Magic Ship (循环节+二分答案)
<题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...
- Codeforces 1117C Magic Ship (二分)
题意: 船在一个坐标,目的地在一个坐标,每天会有一个风向将船刮一个单位,船也可以移动一个单位或不动,问最少几天可以到目的地 思路: 二分天数,对于第k天 可以分解成船先被吹了k天,到达坐标(x1+su ...
- Educational Codeforces Round 60 C 思维 + 二分
https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...
- 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 ...
- Codeforces Round #350 (Div. 2) D1. Magic Powder - 1 二分
D1. Magic Powder - 1 题目连接: http://www.codeforces.com/contest/670/problem/D1 Description This problem ...
随机推荐
- C语言代码里不能用goto?
当我学C语言时,老师整天告诉我:"不要使用goto, 这是一个坏习惯, 这种写法很烂,而且很危险!"等等. 但是为什么那么多内核程序员那么喜欢用goto呢? 在这段linux内核 ...
- Linux 与 BSD
1)Linux 与 BSD 有什么不同? http://linux.cn/article-3186-1.html 2)BSD(Unix)家族 http://blog.csdn.net/cradmin/ ...
- vuex 数据绑定
操作文档: 安装vuex: cnpm install vuex --save 文档介绍: https://vuex.vuejs.org/guide/modules.html import Vu ...
- 正则表达式复习 (?<=) (?=)
1.首先值得一说的是"<" 和">" 不是元字符 "."是元字符 ,连接字符"-",即使在字符组内部也不一定 ...
- 2.3.1 java 内存模型
在前面谈到了一些关于内存模型以及并发编程中可能会出现的一些问题.下面我们来看一下Java内存模型,研究一下Java内存模型为我们提供了哪些保证以及在java中提供了哪些方法和机制来让我们在进行多线程编 ...
- ADB常用命令简洁版整理
ADB全称Android Debug Bridge ,“安卓调试桥梁”连接Android和电脑通信的桥梁. 市面上常见的手机助手,底层调研的都是ADB命令行. C/S架构命令行工具,客户端和服务端都 ...
- C#中特殊的string类型
string C#有string关键字,在翻 ...
- 【Head First Java 读书笔记】(五)编写程序
第五章 编写程序 伪码:伪码能帮你专注于逻辑而不需要顾虑到程序语法 测试码:测试用的程序代码 真实码:实际代码 伪码 伪码是介于真正的java程序与正常英语之间的一种语言.伪码大致包括3部分:实例变量 ...
- Head First Python之人人都爱列表(1-初识Python)
IDLE 内置函数==BIF==built-in function 默认地,内置函数都是紫色,字符串是绿色,关键字是橙色. tab:自动补全 Alt-P:前一个 Alt-N:下一个 列表的特性 列表看 ...
- JS 换行写法
var populatePullUpHtml = function (id) { var html = '<div id="' + id + '" class="' ...