博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2678 跳石头
阅读量:4677 次
发布时间:2019-06-09

本文共 1297 字,大约阅读时间需要 4 分钟。

思路:

  二分跳跃的最短距离 mid 。暴力判断如果有两个石头直接的距离小于 mid ,就把这个石头拿走。如果拿走的石头数目 cnt ≤ m,说明二分的答案可行,ans = mid,接着二分更短的跳跃距离。 

Code:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define lck_max(a,b) ((a)>(b)?(a):(b))#define lck_min(a,b) ((a)<(b)?(a):(b))typedef long long LL;const int maxn=5e5+7;LL d,n,m;LL t[maxn];inline LL read(){ LL kr=1,xs=0; char ls; ls=getchar(); while(!isdigit(ls)) { if(!(ls^45)) kr=-1; ls=getchar(); } while(isdigit(ls)) { xs=(xs<<1)+(xs<<3)+(ls^48); ls=getchar(); } return xs*kr;}inline void out(LL xs){ if(!xs) {putchar(48); return;} if(xs<0) putchar('-'),xs=-xs; int kr[57],ls=0; while(xs) kr[++ls]=xs%10,xs/=10; while(ls) putchar(kr[ls]+48),ls--;}LL cnt,i,now;inline bool check(LL u){ cnt=0,i=0,now=0; while(i<=n) { i++; if(t[i]-t[now]
m) return false; else return true;}LL ans;inline void query(LL l,LL r){ while(l<=r) { LL mid=l+r>>1; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; }}int main(){ d=read();n=read();m=read(); for(LL i=1;i<=n;i++) t[i]=read(); t[n+1]=d;//终点到起点的距离。 query(1,d); out(ans),putchar('\n');return 0;}

 

转载于:https://www.cnblogs.com/lck-lck/p/9856518.html

你可能感兴趣的文章
耶鲁大学——心理学导论(这就是你的大脑)
查看>>
使用gifplayer操作gif的方法
查看>>
利用SOAtest建立自动化测试验证网站是否成功加载
查看>>
win7 64 搭建 64 位 apache httpd php mysql
查看>>
博客存档TensorFlow入门一 1.4编程练习
查看>>
BZOJ 1047 [HAOI2007]理想的正方形
查看>>
卡卡希望快点长大
查看>>
自己写的一个随机快速排序的代码
查看>>
一些鲜为人知却非常实用的数据结构 - Haippy
查看>>
【C#】C#线程_I/O限制的异步操作
查看>>
hdu 4403 简单搜索
查看>>
hdu1565 网络流或状态压缩DP
查看>>
javascript的变量声明和数据类型
查看>>
基于MybatisUtil工具类,完成CURD操作
查看>>
Flask-SQLAlchemy
查看>>
kettle参数、变量详细讲解[转]
查看>>
Ubuntu12.04 下 GTK3.xx 的安装、编译和測试
查看>>
C# - Generics
查看>>
.NET LINQ 转换数据类型
查看>>
[LGP2791] 幼儿园篮球题
查看>>