入门者笔记·神奇的模拟(1)

找规律

例题:来自新世界

原题地址

Description
1000年后的世界,只存在想象中的恐怖动物与人类展开殊死战斗。

想象力足以改变一切。

为了拯救世界,Saki酱独自开始了冒险。

现在有 N 只化鼠阻挡在她的面前,每只化鼠有属性值 Ai, Saki酱将使用技能将它们击败。

已知Saki酱的技能是群体伤害技能,每次可以击败许多化鼠, 但必须要满足的要求是:这一次施放技能所击败的化鼠中, 任意两只化鼠的属性值的乘积都是一个完全平方数。

请问,Saki酱击败所有化鼠最少要使用多少次技能?

Input
第一行为一个正整数 T (1<=T<=10), 代表有T组测试数据;

在接下来的每组数据中:

第一行为一个正整数 N(1<=N<=100000),代表有N只化鼠;

第二行有 N 个数, 第 i 个数为 Ai (1<=Ai<=100000),代表第i只化鼠的属性值为Ai。

Output
输出一行包含一个非负整数,表示Saki 酱击败所有化鼠最少要使用多少次技能。

Sample Input 1
3
5
2 5 8 5 1
4
2 4 8 16
1
3
Sample Output 1
3
2
1
Hint
第一个测试数据中:

第1次技能消灭第1、3只化鼠;第2次技能消灭第2、4只化鼠;第3次技能消灭第5只化鼠。

最少使用3次技能。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
int qq[100010],cnt[100010],ans=0;
int main()
{
	int T,n,i,j;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		ans=0;
		memset(cnt,0,sizeof(cnt));
		for(i=1;i<=n;i++)
			scanf("%d",&qq[i]);
		for(i=1;i<=n;i++)//每个数除去自己的平方因子后,剩下的数与相同的数相乘必为平方数
			for(j=2;j*j<=qq[i];j++)
				while(qq[i]%(j*j)==0) qq[i]=qq[i]/(j*j);//**while勿打作if**
		for(i=1;i<=n;i++)
			if(!cnt[qq[i]])
			{
				ans++;
				cnt[qq[i]]++;//最后统计有哪些数即可
			}
			printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43918350/article/details/88357191
今日推荐