Rikka with Square Numbers 2023“钉耙编程”中国大学生算法设计超级联赛(8)hdu7370

Problem - 7370

题目大意:给出两个数a,b,每次操作可以使其中一个数加上或减去一个任意的完全平方数,问要使a,b相等需要的最少操作次数是多少

1<=a,b<=1e9,a!=b

思路:我们可以将问题转化为将a和b的差w变为0需要的最少操作数,如果w是0显然只需要1次操做。

然后我们考虑2次操作的情况,先考虑做减法,也就是考察是否存在a,b,使得,假设b=a-1,将b代入化简可以发现左式等于2b-1,也就是左式的结果为所有的奇数,那么所有的不是完全平方数的数的最少操作数也就是2。

设b=a-2,左式等于4a-4,也就是所有的4的倍数,那么所有4的倍数所需要的最少操作数也就是2,当b=a-3,b=a-4...时,可以发现得到的结论已经被包含在了我们上面得出过的结论里。

然后考虑做加法,也就是考察是否存在a,b,使得,这时给b赋值不好找规律,那我们就从1~sqrt(w)枚举a,看b是否是完全平方数

考虑操作次数大于2的情况,因为已知奇数的操作次数不超过2,所以偶数最坏就是从相邻的奇数+1得到,操作次数为3,所以不满足上面所有条件的数就直接输出3即可

cpp 复制代码
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n;
bool check(int x)
{//检查一个数是否是完全平方数
	int temp = sqrtl(x);
	for (int i = temp - 5; i <= temp + 5; i++)
	{
		if (i * i == x)
		{
			return 1;
		}
	}
	return 0;
}
void solve()
{
	int a, b, w;
	cin >> a >> b;
	w = abs(a - b);
	if (check(w)) 
        cout << 1;//完全平方数是1
	else if (w & 1 || w % 4 == 0)
	{//奇数和4的倍数是2
		cout << 2;
	}
	else
	{
		int x = sqrtl(w);
		for (int i = 1; i * i <= w; i++)
		{
			if (check(w - i * i))
			{
				cout << 2 << endl;//找到a方+b方=w就是2
				return;
			}
		}
		cout << 3;都不满足就是3
	}
	cout << endl;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}
相关推荐
灵感__idea14 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
端平入洛2 天前
delete又未完全delete
c++
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉