ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #720 (Div. 2) Nastia and a Good Array

2021-05-14 09:01:37  阅读:193  来源: 互联网

标签:Good 两个 数列 int Nastia Codeforces include 互质 质数


一、算法分析

基本题意是给定一个数列,然后每次可以找两个数,将这两个数交换位置,再将两个里面较大的那个换成任意一个大于等于这两个数中较小者的数。或者将两个数中较大的那个变得更大。最终目标是相邻两个数互质。要求这样的操作次数少等于n次。这道题的一个关键信息是操作次数不需要求最小值。

构造方式:因为不一定求最优,所以可以每次只解决一位。题目中还有一个特殊条件,即x和y的范围比原数列的元素范围大所以可以先找到数列里面的最小的数,然后从头到尾将其它数都变成大于原序列的最小值的最大可能值的大质数,比如本题可以用1e9+7和1e9+9交替,由于两个相邻位置的质数一定互质,一个质数一定与一个小于这个质数的数互质。所以出来的数列是邻项互质的。

二、代码

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 using namespace std;
 6 const int N=100050;
 7 int w[N];
 8 const int inf=1000000007;
 9 int n;
10 int main(){
11     
12     int T;
13     scanf("%d",&T);
14     while(T--){
15         scanf("%d",&n);
16         for(int i=1;i<=n;i++) scanf("%d",&w[i]);
17         int minx=inf;
18         int pos=0;
19         for(int i=1;i<=n;i++){
20             if(w[i]<minx){
21                 minx=w[i];
22                 pos=i;
23             }
24         }
25         printf("%d\n",n-1);
26         int cnt=0;
27         for(int i=1;i<=n;i++){
28             if(i==pos) continue;
29             if(cnt++%2) printf("%d %d %d %d\n",i,pos,inf,minx);
30             else printf("%d %d %d %d\n",i,pos,inf+2,minx);
31         }
32     }
33     
34     
35     
36     
37     return 0;
38     
39 }

 

标签:Good,两个,数列,int,Nastia,Codeforces,include,互质,质数
来源: https://www.cnblogs.com/talk-sea/p/14755424.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有