1. 程式人生 > 其它 >Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(被坑好幾次)1300

Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(被坑好幾次)1300

原題連結

Problem - B - Codeforces

題意

給一串數,要把任意兩個相鄰的數的最大公約數=1

每次可以進行一個操作:

取下標為i, j的數,和任意二數x,y,且min(ai,aj)=min(x,y)

滿足上述條件,即可使ai=x,aj=y

限制條件:操作次數 <= n

思路

找到數列最小值,操作完是最小值不變,其餘數大小=最小值+(每個數與最小數下標差值)

換句話說:以最小值為中心,兩邊依次遞增、

附:每次以最小值操作可以保證不越界,而且具有穩定性,不會出現操作者的值小於最小值

程式碼

#include <iostream>
#include<algorithm>

//
找到最小的, 後面都-1 using namespace std; typedef long long ll; const int N = 1e5 + 10; ll a[N]; int gcd(int a, int b) { return b == 0? a: gcd(b, a%b); } int main() { int t; cin >> t; while(t --) { int n; cin >> n; for(int i = 1; i <= n; i ++) cin >> a[i]; a[
0] = 0x3f3f3f3f; int minn = 0; for(int i=1; i <= n; i ++) { if(a[i] < a[minn]) minn = i; } ll x1 = a[minn], x2 = a[minn]; cout << n-1 << endl; for(int i = minn; i < n; i ++) { cout
<< minn << ' '<< i+1 <<' ' << a[minn] << ' '<< 1+x1<<endl; x1 ++;//這裡, 從最小到後面 } for(int i = minn; i > 1; i --) { cout << i-1 << ' '<< minn <<' ' << x2+1 << ' '<< a[minn]<<endl; x2 ++;//這裡, 從最小到前面 } } return 0; }