#|C. Mere Array(排序+思维) Codeforces Round #665 (Div. 2)

原题链接: https://codeforces.com/contest/1401/problem/C
#|C. Mere Array(排序+思维) Codeforces Round #665 (Div. 2)
文章图片

测试样例:

input
4
1
8
6
4 3 6 6 2 9
4
4 5 6 7
5
7 5 2 2 4
output
YES
YES
YES
NO
样例解释:
In the first and third sample, the array is already non-decreasing.
In the second sample, we can swapa 1 a_1 a1? anda 3 a_3 a3? first, and swapa 1 a_1 a1? anda 5 a_5 a5? second to make the array non-decreasing.
In the forth sample, we cannot the array non-decreasing using the operation.
题意: 给你一个整数序列 a a a,其中你可以选择下标为 i i i和 j j j,如果 g c d ( a [ i ] , a [ j ] ) gcd(a[i],a[j]) gcd(a[i],a[j])的值为整数序列中数值最小的元素,那么就可以交换 a [ i ] a[i] a[i]和 a [ j ] a[j] a[j]。问你能否经过若干次这样的操作使得整数序列 a a a变为非递减序列。
【#|C. Mere Array(排序+思维) Codeforces Round #665 (Div. 2)】解题思路: 我们的最终目的就是要将整数序列 a a a变为非递减序列。那么我们拿这个最终序列和原序列进行对比,位置上数值不对的自然是需要靠交换来改变的。而交换的条件则是上述,那么我们如果每一个需要交换的数它们的因子都包含这个最小的数,那么我们就可以通过用这个最小的数来进行交换而不用考虑其他的。假设最小的数为 m i n n minn minn,即如果我们要交换的数 x x x满足 x % m = 0 x\%m=0 x%m=0,那么我们就是可以通过这个最小的数作为媒介来进行转移,如果不行,说明这个要交换的数不能被转移,则说明不行。OK,我们具体看代码。
AC代码:
/* *邮箱:unique_powerhouse@qq.com *blog:https://me.csdn.net/hzf0701 *注:文章若有任何问题请私信我或评论区留言,谢谢支持。 * */ #include //POJ不支持#define rep(i,a,n) for (int i=a; i<=n; i++)//i为循环变量,a为初始值,n为界限值,递增 #define per(i,a,n) for (int i=a; i>=n; i--)//i为循环变量, a为初始值,n为界限值,递减。 #define pb push_back #define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) #define fi first #define se second #define mp make_pairusing namespace std; const int inf = 0x3f3f3f3f; //无穷大 const int maxn = 1e5; //最大值。 typedef long long ll; typedef long double ld; typedef pairpll; typedef pair pii; //*******************************分割线,以上为自定义代码模板***************************************//int t,n,a[maxn],b[maxn]; int main(){ //freopen("in.txt", "r", stdin); //提交的时候要注释掉 IOS; while(cin>>t){ while(t--){ cin>>n; rep(i,0,n-1){ cin>>a[i]; b[i]=a[i]; } sort(b,b+n); //开始对比。 int minn=b[0]; int flag=false; rep(i,0,n-1){ if(a[i]!=b[i]&&a[i]%minn!=0){ flag=true; break; } } if(flag) cout<<"NO"<

    推荐阅读