题解 CF1370B

题解 CF1370B

这个题跟脑筋急转弯一样诶

\(gcd\) 这个东西他有很多种可能性,但是如果我们考虑最简单的数字性质奇偶,就会发现,其实所有偶数的 \(gcd\) 都是 \(2\) 对吧

所以,我们只需要把所有的数字按照

1 奇数 奇数
2 偶数 偶数

的情况组合,就能得到至少 \(n-1\) 个偶数

需要去掉的那两个数字从偶数或者奇数较多的一方去除掉就可以了

怎么取的情况分类讨论一下就可以了

#include<cstdio>
#include<vector>
using namespace std;
vector<int> v1,v2;
int T,n;
int a[2100];
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=2*n;i++){
			scanf("%d",&a[i]);
		}
		if(n==2){
			puts("1 2");
			continue ;
		}
		for(int i=1;i<=2*n;i++){
			if(a[i]%2){
				v1.push_back(i);
			}else{
				v2.push_back(i);
			}
		}
		if(v1.size()%2){
			for(int i=0;i<v1.size()-1;i+=2){
				printf("%d %d\n",v1[i],v1[i+1]);
			}
			for(int i=0;i<v2.size()-1;i+=2){
				printf("%d %d\n",v2[i],v2[i+1]);
			}
		}else if(v1.size()>=4){
			for(int i=0;i<v1.size()-2;i+=2){
				printf("%d %d\n",v1[i],v1[i+1]);
			}
			for(int i=0;i<v2.size();i+=2){
				printf("%d %d\n",v2[i],v2[i+1]);
			}
		}else{
			for(int i=0;i<v1.size();i+=2){
				printf("%d %d\n",v1[i],v1[i+1]);
			}
			for(int i=0;i<v2.size()-2;i+=2){
				printf("%d %d\n",v2[i],v2[i+1]);
			} 
		}		
		v1.clear();
		v2.clear();
	}
	return 0;
}
posted @ 2022-11-30 09:11  Tyrue  阅读(9)  评论(0编辑  收藏  举报