5.7 每日一题题解

序列排序Ⅱ

涉及知识点:

  • 思维/暴力

solution:

  • (题目要求相邻且互质的元素才可以互相交换,我们先不考虑相邻)
  • (假设n = 6,我们只列出来偶数的相对位置:)
  • (假设偶数的相对位置为2,6,4,因为6一定会和4相遇,那么无论如何都无法变成2,4,6)
  • (再次假设n = 6,我们只列出来3和6的位置:)
  • (假设3和6的相对位置为6,3,同理,无论如何都无法变成3,6)
  • (做法已经出来了,我们不需要考虑中间的状态,只需考虑能否转移到最终的状态:)
  • (问题转化成:对于第i个值,前面是否有和其不互质,且大于它的数,如果有,答案一定是No)
  • (那最暴力的做法,就是对于第i个值,求出它所有的因子,将因子作为参数比较)
  • (比如6和3,6的因子包括2,3和6,3的因子只有3,但是3作为因子已经在前面的6出现过,且6>3)

std:

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxn = 100005;
int flag[maxn];
int main()
{
	int n,x;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
	    scanf("%d",&x);
	    if(flag[x] > x){
                  printf("No
");
                  return 0;
              }
              flag[x] = x;
              for(int j=2;j*j<=x;j++){
                  if(x%j == 0){
                      int k1 = j,k2 = x/j;
                      if(flag[k1] > x || flag[k2] > x){
    	                  printf("No
");
    	                  return 0;
    	              }
    	              flag[k1] = flag[k2] = x;
                  }
              }
	}
	printf("Yes
");
	return 0;
}
原文地址:https://www.cnblogs.com/QFNU-ACM/p/12840883.html