CF1850E Cardboard for Pictures

越界问题处理

这题本身很简单,二分答案就行。

但是数据很大,提前开了ULL还是越界。

short check(ll x, vector<ll> a)
{
	ll sum = 0;
	for (int i = 1; i <= n; i++)
	{
		sum = sum + (a[i] + x) * (a[i] + x);//这里的sum是很可能越界的
	}
	if (sum == c) return 1;
	else if (sum > c) return 2;
	else return 3;
}

这个时候可以用开方替代乘法来避免越界。

short check(ll x, vector<ll> a)
{
	ll sum = 0;
	for (int i = 1; i <= n; i++)
	{
		if ((a[i] + x) > sqrt(c - sum) || (a[i] + x == sqrt(c - sum) && (c - sum) % (a[i] + x)))
		{
			return 2;
		}
		sum = sum + (a[i] + x) * (a[i] + x);
	}
	if (sum == c) return 1;
	else if (sum > c) return 2;
	else return 3;
}
posted @ 2023-12-25 12:48  加固文明幻景  阅读(15)  评论(0编辑  收藏  举报