hdu 3335 Divisibility-暴力

本文介绍了一种算法,用于从给定的整数集合中选取最大数量的元素,使得这些元素之间不存在整除关系。该算法通过三层循环实现,复杂度为O(n^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

题意是说给你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;
	
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值