GCD Compression
题目大意:
有一个数组 a 其中有 2n 个数,把它压缩进数组 b,b 的大小是 n-1。
所谓的“压缩”指的是两种操作:
- 首先舍弃 a 当中的两个数(你可以任意选择)。
- 然后每次取出剩下的数组 a 当中的两个数,把他们的和放入数组 b 当中。
要求最终 b 数组中所有数的最大公约数(gcd)要大于 1,即 gcd{b_1,b_2,...,b_n-1}>1
请你把你每一次从 a 中取出的两个数在原来的 a 中的下标输出,如果答案不唯一输出任意一种即可。
题解:
如题目所说,保证每一组数据都有解,那么为什么一定有解呢?
首先,给定的序列里,数的种类可以分成奇数和偶数,对于奇数来说,每两个奇数的和是偶数,对于偶数来说,每两个偶数的和也一定是偶数。因此,我们只需要将2n-2个数取出,合并,使每个数都为偶数,即可保证最大公因数至少为二
那么,我们应该如何取这2n-2个数呢?
如何取数,受制于数列里奇数和偶数的个数。因为数列里的数的总数为2n为偶数,所以如果奇数的个数为奇数,那么偶数的个数也为奇数,这时候只需要奇数偶数分别扔一个出去即可保证两两之间有符合要求的匹配。如果奇数的个数为偶数,偶数的个数也为偶数,那么随便选奇数或偶数扔两个数出去即可(前提是你选中的这种数的类型(奇数or偶数)所包括的数的个数至少大于或等于二
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
struct p{
int num,pos;
p(){}
p(int nnum,int ppos){
nnum = nnum;
pos = ppos;
}
};//记录数列中每个数的大小和下标
vector<p> j,o;//j记录奇数,o记录偶数
int t,n,a[MAXN],cntj,cnto;
int main(){
cin >> t;
while(t--){
j.clear();
o.clear();
memset(a,0,sizeof a);
cin >> n;
for(int i = 1; i <= 2 * n; i++){
cin >> a[i];
if(a[i] % 2 == 1)j.push_back(p(a[i],i));//存数
else o.push_back(p(a[i],i));
}
if(j.size() % 2 == 0 && o.size() % 2 == 0){//判两种类型的数的个数的情况并进行相应的处理
for(int i = 2; i < j.size(); i+=2){
cout << j[i].pos << " " << j[i + 1].pos<< "\n";
}
for(int i = 0; i < o.size(); i+=2){
cout << o[i].pos<< " " << o[i + 1].pos << "\n";
}
}
else if(j.size() % 2 == 1 && o.size() % 2 == 1){
for(int i = 1; i < j.size(); i+=2){
cout << j[i].pos << " " << j[i + 1].pos << "\n";
}
for(int i = 1; i <o.size(); i+=2){
cout << o[i].pos<< " " << o[i + 1].pos<< "\n";
}
}
}
}
GCD Compression的更多相关文章
- Codeforces Round #651 (Div. 2) A Maximum GCD、B GCD Compression、C Number Game、D Odd-Even Subsequence
A. Maximum GCD 题意: t组输入,然后输入一个n,让你在区间[1,n]之间找出来两个不相等的数a,b.求出来gcd(a,b)(也就是a,b最大公约数).让你求出来最大的gcd(a,b)是 ...
- Codeforces Round #651 (Div. 2) B. GCD Compression(数论)
题目链接:https://codeforces.com/contest/1370/problem/B 题意 给出 $2n$ 个数,选出 $2n - 2$ 个数,使得它们的 $gcd > 1$ . ...
- Codeforces Round #651 (Div. 2) B. GCD Compression (构造)
题意:有一个长度为\(2n\)的数组,删去两个元素,用剩下的元素每两两相加构造一个新数组,使得新数组所有元素的\(gcd\ne 1\).输出相加时两个数在原数组的位置. 题解:我们按照新数组所有元素均 ...
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- GCD的相关函数使用
GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
随机推荐
- MVC 与 Vue
MVC 与 Vue 本文写于 2020 年 7 月 27 日 首先有个问题:Vue 是 MVC 还是 MVVM 框架? 维基百科告诉我们:MVVM 是 PM 的变种,而 PM 又是 MVC 的变种. ...
- 04C++核心编程(二-泛型编程)
Day08 笔记 1 函数模板 1.1 泛型编程 – 模板技术 特点:类型参数化 1.2 template< typename T > 告诉编译器后面紧跟着的函数或者类中出现T,不要报错, ...
- 什么事JAVA
1.什么是Java Java是一门面向对象的高级编程语言,不仅吸收了C++语言的各种优点,比如继承了C++语言面向对象的 技术核心.还摒弃了C++里难以理解的多继承.指针等概念,,同时也增加了垃圾回收 ...
- 花两万培训Java的三个同学,最后都怎么样了
仙路尽头谁为峰,学完Java学Python. 前言 对于IT行业的培训,例如Java.大数据.H5等等,我一直保持着肯定的态度. 因为当年大学时期的我,也差点去参加Java培训.一是因为那时钱包空空, ...
- 开源流程引擎camunda如何扩展
市场上基于Java语言的开源工作流引擎有:osworkflow.jbpm.activiti.flowable.camunda等,其中osworkflow.jbpm流程引擎已经过时,目前主流的开源 ...
- centos 修改PHP默认版本
命令行输入export PATH=/usr/local/php/bin:$PATH 然后回车.
- sqlserver用windows方式验证登录踩过的坑
坑位一: 之前没用过windows验证方式登录sqlserver,连接串怎么写 坑位二: 链接上了,但是启动报错 八月 19, 2020 9:33:43 上午 com.microsoft.sqlser ...
- bitmap技术解析:redis与roaringBitmap
bitmap的表象意义是,使用一个01标识位来表示是否的状态,可以达到节省空间和高效判定的效果.在我们的实际工作中,也有着许多的应用场景,相信了解bitmap定会给你带来一些额外的收获. 1. bit ...
- C语言学习之我见-strncmp()字符串比较函数(控制范围)
strncmp()函数,用于范围内,两个字符串的比较,n表示最大比较范围. (1)函数原型 int strncmp(const char *_Str1,const char *_Str2,size_t ...
- 基于thinkphp6 layui的优秀极速后台开发框架推荐
很多时候我们在做项目开发的时候,苦于没有好一点的轮子,自己动手开发的话,太耗费时间了,如果采用VUE的话,学习成本跟调试也比较麻烦, 而且有时候选用的东西甲方也不太容易接受,现在给大家介绍一款优秀的极 ...