Codeforces Round #720 (Div. 2) Nastia and a Good Array
作者:互联网
一、算法分析
基本题意是给定一个数列,然后每次可以找两个数,将这两个数交换位置,再将两个里面较大的那个换成任意一个大于等于这两个数中较小者的数。或者将两个数中较大的那个变得更大。最终目标是相邻两个数互质。要求这样的操作次数少等于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