tip:太难了
/*
这道题目很有意思 是第一次遇到
一道最小化最大值的类似问题
数据1 2 4 8 9
解题思路:1一头 4一头 差值:4 - 1 = 3
4一头 8一头 差值:8 - 4 = 4
1一头 8一头 差值:8 - 1 = 7
或者:1一头 4一头 差值:4 - 1 = 3
4一头 9一头 差值:9 - 4 = 5
1一头 9一头 差值:9 - 1 = 8
对差值求min 第一种安排情况:min(3,4,7) = 3
第一种安排情况:min(3,5,8) = 3
本题要点就是两者之间的距离尽可能大所以距离是从1开始到a[n-1]/N
一直试探下去 这样就有一个区间[1,a[n-1]/N] 这样就能找到一个差值尽可能大的情况
这个就能用到二分查找 贪心
*/
#include <bits/stdc++.h>
using namespace std;
int a[100001],N,C;
//对一个得到的mid进行判断
int judge(int mid){
//将牛放在牛棚里的数量 初始化
int cow = 1;
//当前牛 应为要判断其他牛和当前一头牛的距离差值
int precow = a[0];
//下一头牛 从第二头开始 但是数组下标是1
int nextcow ;
//进行距离测量差值
for( nextcow = 1; nextcow < N; nextcow++){
//判断两头牛之间的距离 大于等于就是满足题目要求:继续往下探测
if(a[nextcow] - precow >= mid){
cow ++ ;
//那么当前牛棚的要更新 应为有一个a[nextnow]和precow的差值满足
//所以precow要变为a[nextnow]
precow = a[nextcow];
//三头牛都有位置
if(cow == 3)
return 1;
}
}
return 0;
}
int Binary(int a[]){
int L = 0;
int R = a[N-1] - a[0];
//最大最小距离
int maxdis;
while(L <= R){
//防止数据过大溢出处理 这个就是a[n-1]/N 两个牛棚距离最大的情况
int mid = L + (R - L) / 2;
if(judge(mid)){
//此时的L就是满足的
maxdis = mid;
//这样距离就比mid更大了 在范围里一直探索
L = mid + 1;
}
else
//距离小于mid 有牛棚两者之间的距离小于mid
R = mid - 1;
}
return maxdis;
}
int main()
{
while(scanf("%d%d",&N,&C) != EOF){
for(int i = 0; i < N; i++ )
scanf("%d",&a[i]);
sort(a,a+N);
printf("%d",Binary(a));
}
return 0;
}
农夫与奶牛 c++ 做到我脱发了
最新推荐文章于 2022-07-21 09:31:29 发布