C. Mere Array

 

 

 

 思路:首先在a数组中找到最小的元素minn,然后将可以整除minn的分为一组,不可以整除minn的分为一组。不可以整除minn的数组元素是不可以更改位置的,因此,这个数组的元素必须是非递减的,如果不是非递减的,则结果为NO。可以看出,能够整除minn的数组元素可以通过minn变换位置,因此首先将这一数组从小到大排序,然后按照下标次序将这两个数组合并成一个数组,最后合并的数组必须是非递减的,否则结果为NO。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int t, n;
int a[N], b[N];
int s1[N], s2[N];
int z1[N], z2[N];
int main(){
    cin >> t;
    while(t--){
        cin >> n;
        for(int i=1;i<=n;i++) cin >> a[i];
        int minn = 0x3f3f3f3f, cnt1=0, cnt2=0;
        for(int i=1;i<=n;i++) minn = min(minn, a[i]);
        for(int i=1;i<=n;i++){
            if(a[i] % minn == 0) s1[++cnt1] = a[i], z1[cnt1] = i;
            else s2[++cnt2] = a[i], z2[cnt2] = i;
        }
        bool flag = true;
        for(int i=1;i<cnt2;i++)
            if(s2[i] > s2[i+1]){
                flag = false; break;
            }
        if(!flag) cout << "NO" << endl;
        else{
            flag = true;
            sort(s1+1, s1+1+cnt1);
            int ix1 = 1, ix2 = 1, ix = 1;
            while(ix1 <= cnt1 && ix2 <= cnt2){
                if(z1[ix1] < z2[ix2]) b[ix++] = s1[ix1++];
                else b[ix++] = s2[ix2++];
            }
            while(ix1 <= cnt1) b[ix++] = s1[ix1++];
            while(ix2 <= cnt2) b[ix++] = s2[ix2++];
            for(int i=1;i<ix-1;i++)
                if(b[i] > b[i+1]){
                    flag = false; break;
                }
            if(flag) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
    return 0;
}

 

posted @ 2022-06-28 18:03  聊服一  阅读(26)  评论(0)    收藏  举报