GCD Compression

题目链接:GCD Compression

 

题目大意:

一个数组A右2n个数,现在要把它压缩到n-1个数,首先选两个数丢掉,然后可以进行如下操作,从A中选两个数,将它们的和加入到数组B,知到A中为空,要求最后B数组中元素gcd大于一。

 

思路:

首先想到让B中所有数为偶数,即gcd为2,两个奇数相加为偶数,两个偶数相加为偶数,分别记录所有的偶数和奇数的下标,然后输出个n-1对数即可

 

参考代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     int t,n;
 7     cin >> t;
 8     while(t--) {
 9         cin >> n;
10         vector<int> even,odd;
11         for(int i = 1; i <= n*2; i++) {
12             int x;
13             cin >> x;
14             if(x & 1) odd.push_back(i);
15             else even.push_back(i);
16         }
17         vector< pair<int,int> > ans;
18         for(int i = 0; i+1 < odd.size(); i+=2) { // 这里写成i < odd.size()-1会RE,下面那个情况相同,原因未知
19             ans.push_back({odd[i],odd[i+1]});
20         }
21         for(int i = 0; i+1 < even.size(); i+=2) {
22             ans.push_back({even[i],even[i+1]});
23         }
24         for(int i = 0; i < n-1; i++) {
25             cout << ans[i].first << " " << ans[i].second << endl;
26         }
27     }
28     return 0;
29 }
View Code

 

posted @ 2020-12-26 22:17  不敢说的梦  阅读(111)  评论(0)    收藏  举报