Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(被坑好幾次)1300
阿新 • • 發佈:2021-06-20
原題連結
題意
給一串數,要把任意兩個相鄰的數的最大公約數=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; }