-
题意:有一个长度为\(2n\)的数组,删去两个元素,用剩下的元素每两两相加构造一个新数组,使得新数组所有元素的\(gcd\ne 1\).输出相加时两个数在原数组的位置.
-
题解:我们按照新数组所有元素均为偶数来进行构造,因为旧数组的长度为\(2n\),所以无论原数组有多少个奇数和偶数,我们都可以选择删去两个数,使得剩下的数两两组合得到偶数,直接分类讨论输出即可.
-
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include <unordered_set> #include <unordered_map> #define ll long long #define fi first #define se second #define pb push_back #define me memset const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; int t; int n; int x; vector<int> v1,v2; int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>t; while(t--) { cin >> n; v1.clear(); v2.clear(); for (int i = 1; i <= 2 * n; ++i) { cin >> x; if (x % 2 == 0) v1.pb(i); else v2.pb(i); } if(v2.size()%2==0){ if(v2.size()>=2){ for(int i=0;i<v2.size()-2;++i){ cout<<v2[i]<<" "; if(i%2==1){ cout<<endl; } } for(int i=0;i<v1.size();++i){ cout<<v1[i]<<" "; if(i%2==1){ cout<<endl; } } } else{ for(int i=0;i<v1.size()-2;++i){ cout<<v1[i]<<" "; if(i%2==1){ cout<<endl; } } } } else{ for(int i=0;i<v2.size()-1;++i){ cout<<v2[i]<<" "; if(i%2==1){ cout<<endl; } } for(int i=0;i<v1.size()-1;++i){ cout<<v1[i]<<" "; if(i%2==1){ cout<<endl; } } } } return 0; }
Codeforces Round #651 (Div. 2) B. GCD Compression (构造)
猜你喜欢
转载自www.cnblogs.com/lr599909928/p/13172496.html
今日推荐
周排行