题目链接:http://codeforces.com/problemset/problem/337/A
题意:有n个学生,m块puzzles,选出n块puzzles,但是需要满足这n块puzzles里的最大pieces(A)和最小pieces(B)之差最少,即the least possible difference。
这是一道贪心兼排序的题目,解决方法不难。首先对m块puzzles以非递减的顺序排序(可以保证每个n长度的区间difference最小),接着求出所有长度为n的区间中最大和最小的值之差,即代码中 a[i+n-1] - a[i] ,最后选出最小的差就是题目的答案。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std; const int maxn = +;
int a[maxn]; int main()
{
int i, n, m, min;
while (cin >> n >> m)
{
for (i = ; i < m; i++)
{
scanf("%d", &a[i]);
}
sort(a, a+m);
// cout << endl;
// for (i = 0; i < m; i++)
// cout << a[i] << " ";
// cout << endl;
min = maxn;
for (i = ; i+n- < m; i++)
{
// cout << a[i+n-1] - a[i] << endl;
if (min > a[i+n-] - a[i]) // 求出所有n区间的最大值和最小值之差
min = a[i+n-] - a[i]; // 并同时得出最终的最小值
}
printf("%d\n", min);
}
return ;
}