洛谷 P9913「RiOI-03」water problem 题解

一、思路

把正方形切成 \(n\) 个小正方形,我们最先考虑的应该是平方数的情况 ,如果 \(n\) 为平方数,那么就可以把它切成 \(n\) 个一模一样的小正方形。

我们也可以考虑一下当 \(n\le8\) 的情况,当 \(n=1\)\(n=4\) 时,\(n\) 为平方数,所以 \(1\)\(4\) 是可以的。

最后发现,当 \(n=6\)\(n=7\)\(n=8\) 也是可以的。

\(n=6\)

\(n=7\)

此时你可以根据以上思路编好代码,就可以骗到 35 分。

我们可以发现,正确的概率会比错误的概率大,我们可以尝试一下当 \(n>8\) 的情况都输出 Yes,交上去时发现对了。

其实,当我们证明 \(6\)\(7\)\(8\) 都是可以的时候,如果我们把图形中的任意一块正方形切割成 \(4\) 个更小的正方形,就等于增加了 \(3\) 个小正方形。

那么 \(9\) 块就可以变为 \(6\) 块加 \(3\) 块。
那么 \(10\) 块就可以变为 \(7\) 块加 \(3\) 块。
那么 \(11\) 块就可以变为 \(8\) 块加 \(3\) 块。
以此类推。

推出结论:除了 \(n=2\)\(n=3\)\(n=5\) 以外,其余都为正确。

二、AC 代码

#include<bits/stdc++.h>
using namespace std;
bool pf(int n)//是否为平方数
{
	if(int(sqrt(n))*int(sqrt(n))==n)return 1;
	else return 0;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		if(n==2||n==3||n==5)cout<<"No\n";
		else cout<<"Yes\n";
	}
	return 0;
}
posted @ 2024-01-21 14:01  fxwqctb  阅读(9)  评论(0编辑  收藏  举报