POJ3258:River Hopscotch

http://poj.org/problem?id=3258

题目意思很清楚,就是移出m块石头使得每头牛跳跃的最短距离最大。开始的时候想用贪心算法来解,但是发现题目的贪心选择不明确,并且数据量很大,于是就放弃了。因为最近在学二分搜索,并且有这一题,所以就思考着用二分搜索来解决这道题目。

以一数值为牛必须跳跃的最短距离(当作一个衡量标准),然后判断在该最短距离下,会移除多少石头,如果移除的石头数目少于或者等于给定的跳跃最短距离则说明,给定的距离偏小,这里是要找出最短距离的上限。如果多于则说明参考距离偏大。这一题和前面的POJ3273相类似。这也是参照二分搜索解题的模型。

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>

using namespace std ;

const int maxn = 50008 ;

int num[maxn] ;
int n ;
int m ;
int l ;

bool judge(int v) ;

int main()
{
	int i ;
	
	while(scanf("%d %d %d" , &l , &n , &m)!=EOF)
	{
		num[0] = 0 ;
	
		for(i = 1 ; i <= n ; i ++)
			scanf("%d" , &num[i]) ;
	
		num[n+1] = l ;
	
		sort(num , num + n + 1) ;
	
		int x ;
		int y ;
		int v ;
		int ans ;
	
		y = l ;
		x = 0 ;
		v = 0 ;
	
		while(x <= y)
		{
			v =( y + x)/2 ;
		
			if(judge(v))
			{
				ans = v ;
				x = v + 1 ;
			}
			else
				y = v - 1 ;	
		}
	
		printf("%d\n" , ans) ;	
	}
	return 0 ;
}

bool judge(int mid)
{
	int i ;
	int j ;
	int cont =  0;
	
	j = 0 ;
	
	for(i = 1 ; i <= n + 1 ; i ++)
	{
		if(num[i] - num[j] < mid)
			cont ++ ;
		else
			j = i ;	
	}
	
	if(cont > m)//值偏大 
		return false ;
	else//值偏小 
		return true ;	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值