幼儿园
题目描述:
幼儿园食品仓库中共有N包糖果,其中第k包糖果当中有Ak颗糖。虽然每包糖果的净含量一样,但是幼儿园的小朋友们并不懂得物理学上“质量”的概念,他们只知道糖果数量越多越好。而小朋友们会比较各自有多少糖果,糖果数量少的当然会不高兴:有 x 颗糖的小朋友看到另一个有 y 颗(y>x)糖果的小朋友时,“不高兴值”为 y-x.
Bob在幼儿园照顾孩子,今天Bob需要把糖果分给小朋友们。为了尽量让小朋友们别那么不高兴,Bob要从N包糖果中挑选M包糖果,每人一包,分给M名小朋友,并使“最不高兴”的小朋友的“不高兴值”尽可能小。请你帮Bob算一下,让最不高兴的小朋友的“不高兴值”的最小值是多少。
输入:
输入第一行一个整数N,表示糖果总共有N包;输入第2行一个整数M,表示幼儿园有M名小朋友。接下来有N行,每行一个整数Ak,分别表示每包糖果中的颗数。
- 2 ≤ N ≤10 5
- 2 ≤ M ≤ N
- 0 ≤ Ak ≤ 10 9
输出:
输出1行,一个整数,表示最不高兴的小朋友的不高兴值。
样例:
样例1:
Input
7
3
10
100
300
200
1000
20
30
Output
20
Hint
Bob应选[10,20,30],这样最不高兴的小朋友有10颗糖,看到有30颗糖的小朋友,不高兴值为20。
样例2:
Input
10
4
1
2
3
4
10
20
30
40
100
200
Output
3
Hint
选[1,2,3,4],最不高兴的小朋友的不高兴值为4-1=3
样例3:
Input
5
2
1
2
1
2
1
Output
0
Hint
选[1,1],或者[2,2],这两个小朋友都拿到一样数量的糖果,不高兴值为0
来源/分类:
思路/注意:
使用了#include<algorithm>头文件下的函数,我一开始只是简单想的排完序之后(使用sort()函数),用范围内的最大值减去最小值,但是不知道如何处理得到最小值,看到题解明白了,继续遍历数组a[n],求(范围最大值减去最小值的)最小值。可以使用min()函数。
代码(C++):
#include<iostream>
#include<algorithm>
using namespace std;
const int maxSize=100000;
int main(){
int n,m;
int minSet;
int a[maxSize];
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
minSet=a[m-1]-a[0];
for(int i=1;i<=n-m;i++){
minSet=min(minSet,a[i+m-1]-a[i]);
}
cout<<minSet<<endl;
return 0;
}