题目描述
s 班共有 n 名学生,按照学号从 1 到的顺序每名学生的身高分别为 a[1],a[2]...a[n]。由于是新学期,s 班需要进行分组,分组的要求如下:
进行分组的组数不能超过 k。 每组的人的学号必须相邻。 由于身高差过大的人分在同一个组会激起组内内部矛盾(QAQ),所以我们定义一个分 组方案的不和谐度为每个组的身高极差(最高的身高-最矮的身高)的最大值。 我们希望最小化这个不和谐度,输出这个不和谐度。
输入数据
第一行包括两个正整数 n,k。 第二行包括用空格隔开的 n 个正整数,第 i 个正整数描述学号为 i 的学生的身高。
输出数据
一行包括一个整数,表示不和谐度最小的分组方案的不和谐度。
样例
输入样例
8 3
5 7 2 3 8 5 9 4
输出样例
5
样例解释
一种可能的分组是 5 7 2 / 3 8 5 / 9 4
数据范围
题解
# include <bits/stdc++.h>
#include <climits>
using namespace std;
int n,k,a[100086],L,R;
bool check(int b)
{
int num=1,big=0,small=INT_MAX;
for (int u=1;u<=n;u++)
{
big=max(big,a[u]);
small=min(small,a[u]);
if (big-small>b)
{
num+=1;
big=a[u];
small=a[u];
}
}
return num<=k;
}
int main()
{
cin>>n>>k;
if (n==1)
{
cout<<0;
return 0;
}
if (n==k)
{
cout<<0;
return 0;
}
for (int u=1;u<=n;u++)
{
cin>>a[u];
R=max(R,a[u]);
}
while (R-L>1)
{
long int mid=(R+L)/2;
if (check(mid))
R=mid;
else
L=mid;
}
cout<<R;
return 0;
}