CometOJ_六一欢乐赛B题: 宝可梦中心大对决!

CometOJ_六一欢乐赛B题: 宝可梦中心大对决!

题目链接

在这里插入图片描述
在这里插入图片描述

看着感觉挺简单的,开始想着直接暴力,遍历一遍数组,发现两两不互质,则标记,但是发现这样并不能求出最大数量,看了官方题解,感觉还是有点东西的。。。。

官方题解

这里用的时间复杂度相对比较高的使用递归来枚举

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int used[20];
int a[20];
int t,n;
int ans;
int gcd(int x,int y){
    return y==0?x:gcd(y,x%y);
}
void dfs(int id){
    if(id==n){
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                if(used[i]&&used[j]&&gcd(a[i],a[j])!=1){
                    return ;
                }
            }
        }
        int cnt=0;
        for(int i=0;i<n;i++){
            if(used[i]==1){
                 cnt++;
            }
        }
        if(cnt>ans){
               ans=cnt;
        }
        return ;
    }
    used[id]=1;
    dfs(id+1);
    used[id]=0;
    dfs(id+1);
}
int  main(){
    scanf("%d",&t);
    while(t--){
        memset(used,0,sizeof(used));
        memset(a,0,sizeof(a));
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        ans=0;
        dfs(0);
        printf("%d\n",ans);
    }
    return 0;
}
发布了127 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/boliu147258/article/details/102157200