有谁能给我【NOIP2015】《跳石头》的暴力代码和二分代码以及其中算法思想的详细解释啊?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有谁能给我【NOIP2015】《跳石头》的暴力代码和二分代码以及其中算法思想的详细解释啊?相关的知识,希望对你有一定的参考价值。
我主要是想问问算法思想
题目如下:
一年一度的“跳石头”比赛又要开始了!
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。
输入文件第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L≥1 且 N≥M≥0。
接下来 N 行,每行一个整数,第 i 行的整数 Di(0<Di<L), 表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
Output
输出文件只包含一个整数,即最短跳跃距离的最大值。
Sample Input
25 5 2
2
11
14
17
21
Sample Output
4
#include<cstring>
using namespace std;
const int maxn=50010;
//n,m,L的意义和题目描述中的一样,a[]表示每个石头到起点的距离,方便起见,将终点补充为最后一块石头
int n,m,L;
int a[maxn];
//二分了最短跳跃距离 mid之后,开始检查这个答案mid能不能满足至多抽走m块石头
bool check(int mid)
//last表示上一块没有被抽走的石头离起点的距离
int last=0,cnt=0;
for(int i=1;i<=n;i++)
//如果两点之间的距离比跳跃距离短,那么就需要把这一块石头拿走,不然的话就可以不用管。
//当然如果i==n也就是终点的时候是不能拿走终点的,但是这个时候拿掉前一个石头也一定能达成目的,所以不管怎样只需要拿掉一个石头。
//如果不用拿掉的话,上一块没有抽走的石头就是当前这一块了。
if(a[i]-last<mid) cnt++;
else last=a[i];
//如果必须要拿掉的石头数目<=m个,说明二分出的最短距离可以接受,返回true
if(cnt<=m) return true;
return false;
int main()
int ans;
scanf("%d%d%d",&L,&n,&m);
n++;a[n]=L;
for(int i=1;i<n;i++) scanf("%d",&a[i]);
int l=0,r=a[n],mid;
while(r-l>1)
mid=(l+r)>>1;
//如果这个值可以接受,那么比它小的值都可以接受,二分的下界就可以变成这个新的值
//如果不能接受,那么比它大的值也不能接受,二分的上界变成这个新的值
if(check(mid)) l=mid;
else r=mid;
//当然如果最后区间还剩下两个的时候,有可能上界也是可以接受的。[其实这种情况只发生在a[n]为最大距离时]
if(check(r)) ans=r;
else ans=l;
printf("%d",ans);
return 0;
这里二分思想的使用是因为如果用1表示一个值可行,0表示一个值不可行的话。
那么值域一定是这样的:
1111111110000000000
也就是说:比最优值小的一定都可行,比最优值大的一定都不可行,这样的话,我们就可以很快的收敛上下界。使得尝试的数目变成log2(L)级别。而每次判断的复杂度是O(n)的,所以得到了满足时间限制的算法。
其中判断的部分使用的是贪心的思想,即能放则放,这个思想经常与二分相结合使用。
本回答被提问者和网友采纳有谁能给我讲讲linux到底是啥,它怎么使用?
我一样都不懂 那位高手指点下 谢谢
参考技术A Linux是一个开源的操作系统,所谓的开源就是开放源代码,现在我们中国国内大部分的大型国有企业和政府部门他们用的电脑操作系统都是Linux,因为Linux是开放源代码的,我们国家可以根据这些代码进行修改,并阻止一些重大的漏洞和后门,避免一些其他国家的人窃取机密,因为windows系统是微软开发的,里面具有一些后门,如果政府部门用Windows系统很容易被微软利用他们给自己预留的后门来窃取国家机密。Linux将会是国内以后发展的趋势 参考技术B Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。 就像微软的WINDOWS 操作系统一样 参考技术C 找我了,我可以给你上上课,哈哈。以上是关于有谁能给我【NOIP2015】《跳石头》的暴力代码和二分代码以及其中算法思想的详细解释啊?的主要内容,如果未能解决你的问题,请参考以下文章