「LuoguP4753」濑 River Jumping(贪心
Description
有一条宽度为 N 的河上,小D位于坐标为 0 的河岸上,他想到达坐标为 N 的河岸上后再回到坐标为 0 的位置。在到达坐标为 N 的河岸之前小D只能向坐标更大的位置跳跃,在到达坐标为 N 的河岸之后小D只能向坐标更小的位置跳跃。在河的中间有 M 个岩石,小D希望能跳到每个岩石上恰好一次。由于小D的跳跃能力太强,小D的跳跃长度有个下限 S ,但没有上限。现在请你判断他是否能够完成他的目标。
Input
第一行输入两个整数 N,M,S,分别表示河的宽度,岩石的数量和跳跃长度的下限。
第二行输入 M 个整数,分别表示 M 个岩石的坐标 w1,w2,⋯,wN 。保证 { wi }为递增序列。
Output
如果小D可以完成他的目标,第一行输出YES,第二行输出 M+2 个数,依次表示小D跳到的石头编号。特殊的,坐标为 0 的河岸编号为 0 ,坐标为 N 的河岸标号为 M+1 。如果有多种解法,允许输出任意一种。
如果小D不能完成他的目标,第一行输出NO。
Sample Input1
6 1 3
3
Sample Output1
YES
1 2 0
Sample Input2
6 2 2
2 4
Sample Output2
YES
2 3 1 0
Sample Input3
5 2 3
2 3
Sample Output3
NO
Hint
1≤N,S≤100000
0 ≤ M < N
1 ≤ wi < N
题解
O(n) 贪心
把一个人来回跳 看作两个青蛙一起跳。
设两只青蛙所在的坐标为 xa , xb。
我们先假设青蛙已经跳了一段路程,且设xa < xb ,面前的最近石块坐标为x
那么有且仅有3种情况:
1: x - xa< s(a青蛙踩不到x),此时 x - xb < s,那么x石块怎样都踩不到,输出NO。
2:x - xa > s 且 x - xb < s(a能踩 b不能踩),那么a青蛙跳到x石块,xa = x 。
3:x - xa > s且 x - xb > s(a,b都能踩),此时可以跳a也可以跳b,但把青蛙a保留在xa 而让b跳到x,比保留b 而让a跳到x对未来有更大的潜力(因为xa < xb,所以xa能跳到的区间比xb大)
那么思路就清晰了:
初始时xa=xb=0。扫描坐标w,对于一个新扫入的坐标值,判定以上三种情况并作出相应决策,把两只青蛙经过的坐标分别存储为 a , b数组。
输出时假装a青蛙正着跳,b青蛙反着跳,0坐标和河对岸手动输出。
注意以上的假设基于 xa < xb的前提,写代码的时候不要思维僵化。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define R register
inline int read()
{char ch=getchar();int x=0;bool s=1;while(ch<'0'||ch>'9'){if(ch=='-')s=0;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return s?x:-x;
}
int a[100007];
int b[100007];
int toa=0,tob=0;
int main()
{int n=read(),m=read(),s=read();int xa=0,xb=0;//一开始都在河岸这边for(R int i=1;i<=m;++i){int x=read();if(xa<xb)//如果xa<xb{if(x-xa<s){cout<<"NO";return 0;}//case 1else if(x-xb<s){a[++toa]=i;xa=x;}//case 2else {b[++tob]=i;xb=x;}//case 3}else//如果xb<=xa{if(x-xb<s){cout<<"NO";return 0;}//case 1else if(x-xa<s){b[++tob]=i;xb=x;}//case 2else {a[++toa]=i;xa=x;}//case 3}}if(n-xa<s&&n-xb<s){cout<<"NO";return 0;}//有青蛙跳不上对岸 输出NOcout<<"YES"<<endl;for(R int i=1;i<=toa;++i)cout<<a[i]<<" ";//a正跳cout<<m+1<<" ";for(R int i=tob;i;--i)cout<<b[i]<<" ";//b反跳cout<<0;return 0;
}
转载于:https://www.cnblogs.com/qwerta/p/9379752.html
「LuoguP4753」濑 River Jumping(贪心相关推荐
- 【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)
http://new.tyvj.cn/p/2065 我就不说我很sb的用线段树来维护值...... 本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法.最后一小时才想出来线段树(果 ...
- LiberOJ - 2603. 「NOIP2012」国王游戏
LiberOJ - 2603. 「NOIP2012」国王游戏 算法 (贪心) O ( n 2 ) O(n^2) O(n2) 我们先给出做法,再证明其正确性. 做法:直接将所有大臣按左右手上的数的乘积从 ...
- 一直学不明白的「递归」与「动态规划」原来这么简单
在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点. 程序员小吴打算使用动画的形式来帮助理解 ...
- 「走过」微软、优步,老工程师告诉你哪些数据结构和算法最重要
数据结构和基础算法作为计算机科学的必学课程,近几年却关注度越来越少.但程序员真的不再需要这两门基础知识了吗?一位在 Uber 等科技公司工作过的开发者分享了他的一手经验,告诉你实际工作中会用到哪些数据 ...
- 正确的「记事本」打开方式:能渲染3D图像,还能玩贪吃蛇
金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 渲染3D图像,一个「记事本」就够了. 最近,GitHub上一名叫"Kyle Halladay"的小哥,便上传了这样一个项 ...
- java正则匹配英文句号_「正则表达式」王国奇遇记
第一回 初来乍到 NPC: "欢迎来到正则表达式的国度,勇士!这里的每一个人都使用正则表达式,我是这里的 NPC,每一个来到这里的人都将由我代为介绍正则世界的规则,至于能领悟到何种境界,就看 ...
- 身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」
作者:沫沫 政采云前端团队 转发链接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ 前言 近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸 ...
- 怎样对流媒体进行压力测试_对node工程进行压力测试与性能分析「干货」
作者:小黎 转发链接:https://mp.weixin.qq.com/s/WBe7ZLoqFD9UqNusnv_IDA 前言 在系统上线前,为了看下系统能承受多大的并发和并发下的负载情况,常常会先进 ...
- 19 「沉淀」,20「继续沉淀」
来了来了 每个做 UI 的 Android 开发 ,上辈子都是折翼的天使 . 本人程序员一枚 ,本行是客户端之一的 Android .一直在为了摆脱程序员的中年危机而努力着 ,其实关于程序员中年危机这 ...
最新文章
- 计算机房做法图集,万科建筑标准工程做法通用图集(全套)
- CC1310射频芯片的433M无线模块设计
- 马云在《赢在中国》对创业者的经典点评
- 矩池云如何使用 Tmux 工具在后台运行任务
- android ndk 头文件,笔记:Android源码和NDK目录及头文件
- #数组元素相乘_C++ 矩阵相乘
- Linux中安装JDK
- mes系统服务器架构,MES系统三大层结构是什么
- 汤晓鸥教授的一篇很有意思的文章
- Google推荐的图片加载库Glide介绍
- 基岩版服务器开启坐标显示,mc基岩版怎么看坐标 mc基岩版如何看坐标
- 剑指offer面试题2:实现单例模式
- 微信朋友圈视频变长从6秒增加为10秒
- DbVisualizer 8.0.11 出现乱码问题
- 海亮DAY8 关于Tarjan算法用于割点割边相关感受
- vue中this.$router.params接收传值为空咋办
- 基于html的网页设计毕业论文,个人主页设计(网页设计毕业论文)
- json c语言开发,JSON c语言开发指南
- C语言初阶——实用调试技巧
- 各国通货膨胀率(1961-2019年)