P1401 题解
交了 10 次硬是没有发现取最大值没有打绝对值,wssb。
因为是要判定两个区间中元素乘积的最大值,那么判定两区间上下界乘积的绝对值的最大值,即 \(\max(|x_ly_l|,|x_ly_u|,|x_uy_l|, |x_uy_u|)\) 是否大于 \(2^{31} - 1\) 即可。
为什么要取绝对值?举个例子,\(x_l=-2^{31},x_u=1,y_l=2^{30},y_u=1\),\(\max(|x_ly_l|,|x_ly_u|,|x_uy_l|, |x_uy_u|)=2^{61}\),而 \(\max(x_ly_l,x_ly_u,x_uy_l, x_uy_u)=2^{30}\),如果没有取绝对值,此时输出 int,而正解应是 long long int。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll r = 2147483647;
ll xa, xb, ya, yb;
void judge(ll x) {
if (x >= r) cout << "long long int";
else cout << "int";
}
int main() {
cin >> xa >> xb >> ya >> yb;
judge(max({abs(xa * ya), abs(xa * yb), abs(xb * ya), abs(xb * yb)}));
return 0;
}

浙公网安备 33010602011771号