题目链接: Mere Array
大致题意:
给你一个由n个正整数构成的数组, 希望你能把它们从小到大排序. 而两个数能进行交换的条件是: 这两个数的最大公约数是这个数组中最小的数字.
解题思路:
如果存在某些数字没有处于正确的位置上, 则表明需要换序.
对于错位的两个数字: 数字x需要与数字y进行交换, 则数字x和数字y都需要能与最小值min交换. 所以我们只需要看是否数组中需要换序的数字是否能与min交换即可. 倘若都可以与min进行交换, 则所有需要换序的数字就都能换到自己正确的位置上.
对于本题:
先将给定的数组进行排序, 然后遍历原数组, 如果当前元素所处的位置不是排序后所应在的位置, 则看看他是否能与数组中的最小值换序(即: 求gcd(min, x)是否等于min. 也等价于x % min == 0
), 如果不能, 则认为无解.
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1E5 + 10;
int a[N], b[N], c[N];
int main()
{
int t; cin >> t;
while (t--) {
int n; scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
b[i] = a[i]; //复制到b数组, 为了排序
}
sort(b + 1, b + 1 + n);
int min_ = b[1];
bool flag = 1;
for (int i = 1; i <= n; ++i) {
if (a[i] != b[i]) {
if (b[i] % min_) { flag = 0; break; }
}
}
if (!flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}