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 ...
随机推荐
- 如何学习MySQL
转自高手的帖子 1.坚持阅读官方手册,看MySQL书籍作用不会特别大:(挑选跟工作相关的内容优先阅读,例如InnoDB存储引擎,MySQL复制,查询优化) 2.阅读官方手册,同时对阅读的内容做对应的测 ...
- Mybatis和Hibernate比较
作者:乌拉拉链接:http://www.zhihu.com/question/21104468/answer/58579295来源:知乎著作权归作者所有,转载请联系作者获得授权. 1.开发对比开发速度 ...
- c++模板实现 linq
// ConsoleApplication32.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" using namespace std; # ...
- hdu 2206 IP的计算(最全的注意事项)
注意: 1.非法字符(包括空格) 如下都是错的 A.145.124.4 192.168.18 123(用scanf输入的话,则接收的是:192.168.18) 2.'.'有且仅有3个,且不能连续出现, ...
- TinyMCE4.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- 设计模式05: Prototype 原型模式(创建型模式)
Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...
- .net Reflection(反射)- 一
Reflection 反射需要引用 using System.Reflection; 命名空间. 通过 Assembly 类的 Load( ); 加载指定的 程序集 Assembly 是不能被实例化 ...
- js 封装常用方法
1. 获取数据类型 function getType(params) { , -) } 2. 深拷贝 function deepCopy(params) { var obj; if (typeof p ...
- "window.location.href"、"location.href"是本页面跳转
"window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...
- 简单的 socket 代码
TCP 编程 客户端代码 将键盘输入的字符发送到服务端,并将从服务端接收到的字符输出到终端 #!/usr/python3 import socket def socket_client(): s = ...