题解
题目大意 给你两个数列长度为n和m 构成一个n*m的矩阵 每位的值为两数列对应位置乘积 要求找到一个面积最大的矩形且数值和小于等于x
可以发现 矩阵和实际上就是量数列和的乘积 使用数组sa和sb求出长度为i的时候的最小和 暴力枚举每个长度计算答案
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e3 + 10;
int a[MAXN], b[MAXN];
int sa[MAXN], sb[MAXN]; //长度为i时的最小值
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int N, M, X;
cin >> N >> M;
for (int i = 1; i <= N; i++)
scanf("%d", &a[i]), sa[i] = INF;
for (int i = 1; i <= M; i++)
scanf("%d", &b[i]), sb[i] = INF;
cin >> X;
for (int i = 1; i <= N; i++)
{
int s = 0; //求和
for (int j = i; j <= N; j++)
s += a[j], sa[j - i + 1] = min(sa[j - i + 1], s); //计算每个长度的最小和
}
for (int i = 1; i <= M; i++)
{
int s = 0;
for (int j = i; j <= M; j++)
s += b[j], sb[j - i + 1] = min(sb[j - i + 1], s);
}
int ans = 0;
for (int i = 1; i <= N; i++) //枚举长度
for (int j = 1; j <= M; j++)
if (1LL * sa[i] * sb[j] <= X)
ans = max(ans, i * j);
cout << ans << endl;
return 0;
}