枚举法、穷举法

首先是一道暴力枚举的例题,然后陈述枚举法的定义和暴力指的是什么意思;


题目描述

有一天,mirror给了kyoma一个数x,让kyoma找到一个正整数y>=2,使得y-x的绝对值最小。
但是kyoma觉得这样做太简单了,于是她反问mirror,要求在满足上一个条件的同时,这个y中的每个质因数均恰好出现2次。
mirror感到很困难,你能够帮帮她吗?

输入

第一行输入一个整数T(1<=T<=50)
每组数据有一行,一个整数x(1<=x<=10^18)

输出

对于每组数据,输出一行y-x的最小绝对值

样例输入

5
1112
4290
8716
9957
9095

样例输出

23
65
67
244
70


一、题目信息:
1.绝对值——>y可能比x小,可能比x大,但是满足条件的y一定是在x周围的——>while(x--)  while(x++)
2.质因数(把喵喵坑的好苦啊)——>给定一个数n,n的因数是质数,则称该数为质因数
3.y中的每个质因数均恰好出现两次——>y一定是一个平方数——>y一定是一个合数——>合数可以表示成若干个质数相乘的形式
          ↓
     从2开始验证,在sqrt(y)中只能出现一次,出现两次以上,该数一定不符合条件,且通过验证的数一定是质数

二、代码实现:

typedef long long ll;
while(t--)    (我学了一些小改变)


#include 
#include 
using namespace std;
typedef long long ll;
bool judge(ll y)
{
	bool re=true;
	if(sqrt(y)!=(ll)sqrt(y))
	{
		return false;
	}
	ll s=sqrt(y);
	for(ll i=2;s!=1;i++)
	{
		if(s%i==0)
		{
			s/=i;
			if(s%i==0)
			{
				return false;
			}	
		}
	}
	return re;
}
int main()
{
	int T;
	ll x;
	ll y;
	cin>>T;
	ll minus,mm,min;
	while(T--)
	{
		cin>>x;
		y=x;
		while(y)
		{
			minus=x;
			if(judge(y))
			{
				minus=abs(x-y);
				break;
			}
			y--;
			
		}
		y=x+1;
		while(1)
		{
			mm=x;
			if(judge(y))
			{
				mm=abs(x-y);
				break;
			}
			y++;
			
		}
		min=mm


(声明:完全是个人理解,不是课本上的官方定义,有理解不对的地方,求求你告诉我)

暴力法:从题意出发,不运用什么技巧,按照题目的条件或者是数学公式,顺序解题。
(在暴力的过程中可能会发现简单解题的方法,例如:含有多个变量的等式,可能可以减少变量,从而可能减少循环)

枚举法与穷举法:根据题目给出的限制条件,挨个数据进行检验,最终找出符合条件的答案。(在范围内,挨个判断挨个找)
枚举法的缺点:数据量大的话会导致时间崩溃
枚举的一般结构:while循环
枚举解题的基本思路:
1.确定枚举对象,枚举范围和判断条件
2.枚举可能的解,验证

经典问题:百钱买百鸡
有一个人有一百块钱,打算买一百只鸡。到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?



你可能感兴趣的:(acm)