[codeforces 1300B] Assigning to Classes 排序+取中间两个数

[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]);
	}
}
发布了537 篇原创文章 · 获赞 529 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104243912