CF1401C Mere Array 思维题|淼题

题意:

给定一个长度为n的序列,每次可以将$ GCD(a_i,a_j)=min(a_k)|(1\leq k \leq n)$的两个数交换位置,求序列能否调整成单调不降序列,多组数据t

范围&性质:\(1\leq t \leq 10^4,1\leq n\leq 10^5\)

分析:

第一眼真的是一脸懵,这和GCD有什么关系

仔细分析发现只要,先对整个序列排个序,然后对于任意两个位置错乱的数$ a_i,a_j\(,如果\)GCD(a_i,a_j)=min(a_n)\(那么他们可以互换位置。若不满足,只要存在一个\)a_k\(满足\)GCD(a_i,a_k)=GCD(a_j,a_k)=min(a_n)\(那么他们就可以互相调整,转念一想\)min(a_n)\(不就是我们想要的\)a_k$ 吗?!!!也就是说对于每一个位置不对的数只要判断他是否是\(min(a_n)\)的倍数就可以了,若不是则无法调整,即无解

代码:

#include<bits/stdc++.h>

using namespace std;

namespace zzc
{
	const int maxn = 1e5+5;
	long long n,t,minn;
	long long a[maxn],b[maxn];
	bool flag;
	
	void work()
	{
		scanf("%lld",&t);
		while(t--)
		{
			flag=false;
			minn=0x7ffffffffffff;
			scanf("%lld",&n);
			for(int i=1;i<=n;i++)
			{
				scanf("%lld",&a[i]);
				b[i]=a[i];
				minn=min(minn,a[i]);
			}
			sort(b+1,b+n+1);
			for(int i=1;i<=n;i++)
			{
				if(a[i]==b[i]) continue;
				if(b[i]%minn)
				{
					flag=true;
					printf("No\n");
					break;
				}
			}
			if(flag) continue;
			printf("Yes\n");
		}
	}
	
	
}

int main()
{
	zzc::work();
	return 0;
}
原文地址:https://www.cnblogs.com/youth518/p/13649619.html