题意
链接: link.
给定一个数组,目的是排成升序
排序规则主要是交换两个元素
交换元素的规则是当两个元素的gcd(x,y)=minv
minv是数组中最小值
问是否通过这种规则使数组升序
思路
我们知道:
1、swap(x,y)
等价于
swap(x,minv)+swap(y,minv)+swap(x,minv)
交换两个元素等价于每一个元素和最小值交换
2、判断规则就变成了gcd(ele,min)=min?
等价于minv是否可以整除ele
3、排序一遍,然后,判断每一个需要换位元素是否可以整除最小值
AC代码
#include <bits/stdc++.h>
using namespace std;
int t, n;
#define N 100005
int arr[N], brr[N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--)
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
brr[i] = arr[i];
}
sort(arr + 1, arr + n + 1);
int minv = arr[1];
bool flag = true;
for (int i = 1; i <= n; i++)
{
if (arr[i] != brr[i])
if (brr[i] % minv != 0)
flag = false;
}
puts(flag ? "YES" : "NO");
}
//system("pause");
return 0;
}