题解 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;
}