题解:CF1635C Differential Sorting

· · 题解

题目分析

你的目标是使得最终的数组按照非降序排列。请给出你所构造的方案的操作次数,并给出每次操作中你选择的三个整数 观察题面,显然有“构造”二字,那么就是构造题,存在规律和多解。

仔细分析题意

非降序排列就说明元素与元素可以相等,那么可以将所有数字改成同一个数满足需求。保持不下降就意味着应尽量减少靠后元素的改变,防止影响已经改好的数要再次改变。那么想到保持数组末两位元素不变,将前面的元素赋值为末两位之差。 此外需要注意,若数组本身就是非降序的,输出 0。若倒数第二位大于最后一位,样例无解。若最后一位小于 0,则无解,分两类讨论。如果倒数第二位大于最后一位和最后一位大于倒数第二位。仔细思考。

#include<bits/stdc++.h>
using namespace std;
int a[214514];
int t;
int main()
{
    cin>>t;
    for(int i=1; i<=t; i++) 
    {   
        bool f=0;
        int n; 
        cin>>n;
        for(int i1=1;i1<=n;i1++)
        {
            cin>>a[i1];
            if(a[i1]<a[i1+1]) 
                f=1; //是否已经单调上升(>=) 
        }
        if(f==0) //说明数组已经是非降序的,无需进行操作
        {
            cout<<0<<endl;
            continue;
        }
        if(a[n-1]>a[n]||a[n]<0) 
            cout<<-1<<endl; //无解
        else //可以通过(n-2)次操作达成目标 
        {
            cout<<n-2<<endl;
            for(int j=1;j<=n-2;j++)
                cout<<j<<" "<<n-1<<" "<<n<<endl; 
        }
    }
}

第一次写题解,写的不好还请见谅QWQ