• [NOIP2015提高组]跳石头


    题目:洛谷P2678、Vijos P1981、codevs4768、UOJ#148。

    题目大意:有n块石头,现在要从起点0依次跳过所有石头跳到终点l。现在要去掉m块石头,使选手跳过的最短距离最长,求最长是多少。

    解题思路:本题是最大化最小值问题,考虑二分答案解决。

    判断答案可行性用贪心。用now记录前一块石头的位置。如果当前一块石头i和前一块的差值小于当前答案时,令now=i,否则必定要去掉这块石头,计数器cnt+1。最后如果cnt≤m则答案可行。

    时间复杂度$O(nlog _2 l)$。

    C++ Code:

    #include<cstdio>
    using namespace std;
    int l,n,m,a[50005];
    bool ok(int ans){
    	int now=0,cnt=0;
    	for(int i=1;i<=n+1;++i)
    	if(a[i]-a[now]>=ans){
    		now=i;
    	}else ++cnt;
    	return cnt<=m;
    }
    int main(void){
    	scanf("%d%d%d",&l,&n,&m);
    	a[0]=0;
    	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
    	a[n+1]=l;
    	int L=0,R=l,ans=l;
    	while(L<=R){
    		int mid=(L+R)>>1;
    		if(ok(mid))L=(ans=mid)+1;else
    		R=mid-1;
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    函数模板
    三次握手四次分手
    多态
    函数指针与多态
    继承和派生
    使用ntp 实现时间同步
    Hadoop之Mapreduce 程序
    hadoop学习笔记二
    hadoop学习笔记 一
    大数据知识和资料总结
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7647285.html
Copyright © 2020-2023  润新知