zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    觅踪2
    构建之法阅读笔记08
    觅踪1
    暑期第四周学习周总结
    暑期第三周学习周总结
    暑期第二周学习周总结
    数据库程序设计第九天--整合总结
    数据库程序设计第八天--隔离人员权限
    数据库程序设计第七天--隔离地权限
    数据库程序设计第六天--管理员权限
  • 原文地址:https://www.cnblogs.com/youth518/p/13649619.html
Copyright © 2011-2022 走看看