POJ 3258 River Hopscotch

本文深入探讨 POJ3258 河跳方格问题的解决策略,通过算法分析和代码实现,阐述如何在河流中通过最优方式跳过石头,以达到石头间最短距离最大化的解决方案。详细介绍了二分查找法的应用,以及代码实现的优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POJ 3258 River Hopscotch

题意:在一段长度为L的河里,有n个石头(不包括首尾0号石头,L号石头),可以去掉m个石头,求一种去掉石头的方案,使其中剩余的石头里,石头间最短距离尽可能大,输出那个最短距离

思路:先给石头排序~记得加上首尾两个石头~然后对答案二分,求当前答案(最短距离)下最少要去掉多少石头。(二分不断找出结果的上下界)

AC代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main
{
	static Scanner scan=new Scanner(System.in);
	
	public static void main(String[] args)
	{
		int L=scan.nextInt(),n=scan.nextInt(),m=scan.nextInt();
		int a[]=new int[n+2];
		a[0]=0;a[n+1]=L;
		for(int i=1;i<=n;i++) a[i]=scan.nextInt();
		Arrays.sort(a);
		int sum=0,count=0,ans=1;//sum用来累计距离
		for(int l=1,r=L,mid=(l+r)>>1;l<=r;mid=(l+r)>>1,sum=0,count=0)//mid代表当前假设的答案
		{
			for(int i=1;i<n+2;i++)
				if((sum+=a[i]-a[i-1])<=mid) count++;//如果sum累加了下一段距离a[i]-a[i-1]也小于mid,就count+1,表示去掉靠后的石头
				else sum=0;//否则清零,从下一个石头开始计算(这计算的是至少要去掉几个石头)
			if(count<=m) ans=l=mid+1;//如果要去掉的石头少于m个~~说明mid取的不够大,即使等于m个也不代表找到答案了,因为mid是假设的距离,有可能不存在这样长度为mid的距离
			else r=mid-1;
		}
		System.out.println(ans);//区间的左端
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值