HDU 4004

二分查找:在 0 和 L 之间,枚举距离,假设mm = (0 + L) >>1,然后每次用最长为mm的距离去跳,最后看跳完的次数是否满足条件,若不满足,则表明,<=mm的距离都不行,则再查找mm+1到L之间的距离……


#include "stdio.h"
 
 int l, n, m;
 int stn[500005];
 
 void qsort(int st, int ed){
 	int s = st; int e = ed;
 	int t = stn[st];
 	if(st>=ed) return;
 	while(s<e){
 		while(s<e && stn[e]>=t) e--;
 		stn[s] = stn[e];
 		while(s<e && stn[s]<=t) s++;
 		stn[e] = stn[s];
 	}
 	stn[s] = t;
 	qsort(st, s-1);
 	qsort(s+1, ed);
 }
 
 int find(int len){
 	int i, j, s = 0;
 	j = 0;
 	while(j<n+1){
 		i = j+1;
 		while(i<=n+1 && stn[i]-stn[j]<=len) i++;
 		s++; i--;
 		if(i==j) return 0;  /*i==j时,表明连续的两个石头的距离大于len,跳不过去*/
 		j = i; /*更新j为下一跳的起始*/
 	}
 	if(s<=m) /*判断最后跳的步数,是否小于m*/
 		return 1;
 	else
 		return 0;
 }
 
 int main(){
 	int i, mid, lf, rt, ans;
 	freopen("in.txt", "r", stdin);
 	while(scanf("%d %d %d", &l, &n, &m)!=EOF){
 		for(i=1; i<=n; i++)
 			scanf("%d", stn+i);
 		stn[0] = 0; stn[n+1] = l;
 		qsort(1, n);
 		lf = 0; rt = l;
 		while(lf<=rt){
 			mid = lf + ((rt-lf)>>1);
 			if(find(mid)){
 				rt = mid-1;
 				ans = mid;
 			}else
 				lf = mid+1;
 		}
 		printf("%d\n", ans);
 	}
 	return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值