SDUT 3916
怎么说呢,这也算是一类题型吧,,,
这类题的主要思想就是运用二分;;;;;
这道题的主要想法就是二分搜索找到最优解,首先确定解区间,在区间内二分,通过限定条件,分别向上向下递归
#include <bits/stdc++.h>
using namespace std;
int n,m;
long long ans;
int a[100005];
void binsearch(int low,int high)
{
if(low>high)
return ;
int mid=(high-low)/2+low;
int sum=0,count=1;
for(int i=1;i<n;i++)
{
if(sum+a[i]-a[i-1]<=mid)//用mid 来限定每次可否继续向下划,如果没有超出限定,就加上
{
sum+=a[i]-a[i-1];
}
else//如果超出限定,就重置,并++;
{
count++;
sum=0;
}
}
if(count>m)//解小了,向上递归
{
binsearch(mid+1,high);
}
else//反之向下递归
{
ans=mid;//这个地方读者可以好好思考,实在不明白的话在下方留言
binsearch(low,mid-1);
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int high=a[n-1]-a[0];//最差解
int low=0;解下限
binsearch(low,high);
printf("%lld\n",ans);
}
}