[codeforces 1300B] Assigning to Classes 排序+取中间两个数
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.ml/contest/1300/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Assigning to Classes | GNU C++11 | Accepted | 62 ms | 600 KB |
//排序+取中间两个数
手枚几组数据找到的规律
以下数据中的1,2,3......仅表示大小关系,如1表示最小的数,2表示第2小的数,3表示第3小的数,以此类推。
1个数的分组,只能选1个数。
2个数的分组,每个班各选1个数。
4个数的分组,1个班选1个数,另1个班选3个数:
[1],[2,3,4]差值3-1;[2][1 3 4]差值3-2;[3][1 2 4]差值3-2;[4][1 2 3]差值4-2; 差值最小是3-2 排序+取中间两个数
6个数的分组,1个班选1个数,另1个班选5个数:
[1],[2,3,4,5,6]差值4-1;[2],[1,3,4,5,6]差值4-2;[3],[1,2,4,5,6]差值4-3;[4],[1,2,3,5,6]差值4-3;[5],[1,2,3,4,6]差值5-3;[6],[1,2,3,4,5]差值6-3;
差值最小是4-3 排序+取中间两个数
6个数的分组,1个班选3个数,另1个班选3个数:
因有20组,此处不写了,发现 差值最小是4-3 排序+取中间两个数
有思路,编码就容易了。
#include <cstdio>
#include <algorithm>
using namespace std;
int a[200010];
int main(){
int t,n,i;
scanf("%d",&t);
while(t--){
scanf("%d",&n),n*=2;
for(i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+1+n);
printf("%d\n",a[(1+n)/2+1]-a[(1+n)/2]);
}
}