题目链接: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] ,最后选出最小的差就是题目的答案。
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include <string.h> 5 using namespace std; 6 7 const int maxn = 1000+5; 8 int a[maxn]; 9 10 int main() 11 { 12 int i, n, m, min; 13 while (cin >> n >> m) 14 { 15 for (i = 0; i < m; i++) 16 { 17 scanf("%d", &a[i]); 18 } 19 sort(a, a+m); 20 // cout << endl; 21 // for (i = 0; i < m; i++) 22 // cout << a[i] << " "; 23 // cout << endl; 24 min = maxn; 25 for (i = 0; i+n-1 < m; i++) 26 { 27 // cout << a[i+n-1] - a[i] << endl; 28 if (min > a[i+n-1] - a[i]) // 求出所有n区间的最大值和最小值之差 29 min = a[i+n-1] - a[i]; // 并同时得出最终的最小值 30 } 31 printf("%d\n", min); 32 } 33 return 0; 34 }