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;
}
posted @ 2023-12-11 19:43  FurippuWRY  阅读(18)  评论(0)    收藏  举报