mocc 农夫牛栏问题 java

农夫John的畜栏包含N个不同位置的隔间,他有C头牛希望彼此间隔最大化。输入隔间位置后,通过排序和二分查找,求解最大的最小距离为3。解题策略涉及数组排序和二分搜索算法。

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

题目:

  /*农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这
           些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).
           John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互
           相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的

           最小距离是多少呢?*/

输入:

5 3

1

2

8

4

9

输出:

3

解题思路:

该题采用二分法,L为0,R为a数组的最大和最小的差,先对数组排序,然后二分查找,然后这个mid 满足距离的条件,保存住mid ,继续往下面寻找L=mid+1,如果不满足,那就r=mid-1;直到找到为止。

import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;

public class Main2 {
           public static void main(String[] args) {
			//zhao1();
			//gen();
			//zhengshudui();
			niu();
		}
         
           public static void niu(){
        	   /*农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这
        	   些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).
        	   John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互
        	   相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的
        	   最小距离是多少呢?*/
        	   Scanner scanner = new Scanner(System.in);
        	   int n = scanner.nextInt();//隔间
        	   int m=scanner.nextInt();//放牛
        	   int a[]=new int[n];
        	   for (int i = 0; i < a.length; i++) {
				a[i]=scanner.nextInt();
			}
        	   Arrays.sort(a);
        	  /* for (int i : a) {
				System.out.println(i);
			}*/
        	   int num=0;
        	   int l=0;
        	   int mid;
        	   int r=a[n-1]-a[0];
        	   while(l<=r){
        		    mid=l+(r-l)/2;
        		   if(pi(mid, a,m)){
        			   num=mid;
        			   l=mid+1;
        		   }
        		   else{
        			   r=mid-1;
        		   }
        	   }
        	   System.out.println(num);
           }
      //进行判断操作
           public static boolean pi(int n ,int a[],int m){
        	   int num=1;
        	   int p=a[0];
        	   for (int i = 1; i < a.length; i++) {
				if(a[i]-p>=n){
					num++;
					p=a[i];
					if(num==m){
						return true;
					}
				}	
			}   
        	   return false;
           }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值