您的位置:首页 > 其它

hdu 3335 Divisibility-暴力

2015-10-18 16:04 337 查看
题意:

题意是说给你n个数,让你从中选出最多的数,满足够使得其两两之间不能整除

n只有1000;

直接暴力

第一个for 表示 如果选了第i个,最后最多呢个得到几个

第二个for表示 选了i后,能否选j,如果选了j ,则把与j冲突的都删掉,如果没选上,则跳过

第三个for 是删除掉所有与j冲突的

复杂度o(n^2)

 #include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
__int64 tm[1006];
__int64 vis[1006];
__int64 tol[1006];
int max(int a,int b)
{return a<b?b:a;}
int main()
{

__int64 t;
scanf("%I64d",&t);
__int64 i,j,k;
__int64 n;
while(t--)
{
scanf("%I64d",&n);
for (i=1;i<=n;i++)
{
scanf("%I64d",&tm[i]);
}
sort(tm+1,tm+1+n);

for (i=1;i<=n;i++) //假如选了第i个
{
tol[i]=1;
memset(vis,0,sizeof(vis));
for(j=i+1;j<=n;j++)
{
if (vis[j]|| tm[j]%tm[i]==0 ) //与第i个冲突的就不能选
continue;
for (k=j+1;k<=n;k++)
{
if (tm[k]%tm[j]==0) //j与i不冲突,选了j,现在要把与j冲突的都删掉
vis[k]=1;

}
tol[i]++; //可以选第j个,那么选第i个的方案最后答案会加1
}
}
__int64 ans=tol[1];
for (i=1;i<=n;i++)
ans=max(tol[i],ans);

printf("%I64d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: