题意:给一段长度为N数字(不保证有序),将其分成M段,问这M段中,长度最小值最大为多少?(最大化最小值)
思路:二分答案模板
题目链接:POJ2456
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define maxn (int)1e5+10
#define INF 1000000000
typedef long long ll;
typedef double db;
int data[maxn],n;
bool judge(int len,int m)
{
int head,tail;
head=0;
for(int i=1;i<m;i++)
{
tail=head+1;
while(tail<n && data[tail]-data[head]<len)
tail++;
if(tail==n)
return false;
head=tail;
}
return true;
}
int solve(int m)
{
int l,r,mid;
l=0;
r=INF;
while(l+1<r)
{
mid=(l+r)/2;
if(judge(mid,m))
l=mid;
else
r=mid;
}
return l; //l一定是答案
}
int main()
{
int m;
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
cin>>data[i];
sort(data,data+n);
cout<<solve(m)<<endl;
}
return 0;
}
本文介绍了一种使用二分查找算法解决特定问题的方法:将给定的一系列数字分成指定数量的段,并最大化这些段中最短段的长度。通过分析问题并给出具体的代码实现,展示了如何高效地解决此类问题。
1万+

被折叠的 条评论
为什么被折叠?



