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;
}