hdu 3335

来源:互联网 发布:ubuntu查看ssh端口 编辑:程序博客网 时间:2024/06/01 09:20

题解思路:

根据整除关系建立有向关系图,然后求最小覆盖路径,然后用m减去就是答案了。


代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>using namespace std;const int mx=1e3+10;typedef long long ll;using namespace std;ll n,m,k,s[mx];int cp[mx];bool pai[mx][mx],vis[mx];bool pipei(int x){for(int i=1;i<=m;i++){if(!vis[i]&&pai[x][i]){vis[i]=1;if(!cp[i]||pipei(cp[i])){cp[i]=x;return 1;}}}return 0;}int main(){    int t;    scanf("%d",&t);    while(t--){        memset(pai,0,sizeof(pai));        memset(cp,0,sizeof(cp));        scanf("%lld",&n);        for(int i=1;i<=n;i++) scanf("%lld",s+i);        sort(s+1,s+1+n);        m = 1;        for(int i=2;i<=n;i++)        if(s[i]!=s[i-1]) s[++m] = s[i];        for(int i=1;i<=m;i++){            for(int j=i+1;j<=m;j++)            if(s[j]%s[i]==0) pai[j][i] = 1;        }        int sum = 0;        for(int i=1;i<=m;i++){            memset(vis,0,sizeof(vis));            if(pipei(i)) sum++;        }        printf("%d\n",m-sum);    }return 0;}


原创粉丝点击