题目
翻译
题目
毕业将近,Manana老师不久就要对一个班级say goodby了。她决定准备一个送别礼物给她的
n
n
n个学生并且给每人一个拼图(正如维基百科说的那样,需要组装许多形状各异的碎片,碎片可以相互镶嵌)
售货员告诉老师店里有
m
m
m个拼图,但它们的难度和大小各不同相同。具体来说,第一个拼图有
f
f
f1个碎片,第二个有
f
f
f2个碎片,以此类推。
Manana不希望让孩子们沮丧,因此她决定她送出去的礼物中碎片个数的差异要尽可能地小。设
A
A
A为老师所买的拼图中碎片数最多的碎片个数,
B
B
B为最少的碎片个数。她希望她所选的n个拼图中
A
−
B
A-B
A−B尽可能小。帮助老师找到
A
−
B
A-B
A−B最小的值。
输入
第一行为以空格分隔开的整数 n n n和 m ( 2 ≤ n ≤ m ≤ 50 ) m(2≤n≤m≤50) m(2≤n≤m≤50)。第二行为 m m m个以空格分割开的整数 f f f1, f f f2,…, f f fm ( 4 ≤ (4≤ (4≤ f f f1 ≤ 1000 ) ≤1000) ≤1000)一商店中每个拼图的碎片数。
输出
输出最小可能的值。
分析
先排序,再按照 n n n的长度求出每段的值,得出最小值。
代码
#include<iostream>
using namespace std;
int main()
{
int n,m ,arr[51];
int temp;
int i, j;
cin >> n>>m;
for (i = 0; i < m; i++)
{
cin >> arr[i];
}
//冒泡排序
for (i = 0; i < m - 1; i++)
for (j = 0; j < m - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int min = 1000;
for (i = 0, j = i + n - 1; j < m; i++, j = i + n - 1)
{
if (arr[j] - arr[i] < min)
min = arr[j] - arr[i];
}
cout << min;
}