uva1580
題意:給定一個水池,水池每個格子都有深度,給出a,b使得放入水池的矩形長,寬不超過a,b。找出一個矩形,使得體積最大
分析:暴力可以過,但是有很多其他解法,比如二分體積,枚舉位置;或者是以深度為搜索對象,相同的深度格子連接起來,這種方法要要考慮一些細節。
?
#include<bits/stdc++.h>using namespace std;#define rep(i,x,y) for(int i=x;i<y;i++)int a, b, m, n, d[506][506], dep[505];long long ans, V, S;int main(){while (scanf("%d%d%d%d", &a, &b, &m, &n) == 4) {ans = 0;rep(i, 0, m) {rep(j, 0, n) {scanf("%d", &d[i][j]);}}if (b < a)swap(a, b);//make sure that b>=arep(i, 0, m) {//枚舉起始橫坐標rep(j, 0, n) {//枚舉起始縱坐標memset(dep, 0x3f, sizeof(dep));rep(r, i, m) {int aa = r - i + 1;if (aa > b)break;rep(c, j, n) {int bb = c - j + 1;if (bb > b || min(bb, aa) > a)break;dep[c] = min(dep[c], d[r][c]);if (c)dep[c] = min(dep[c - 1], dep[c]);V = 1LL * aa*bb*dep[c];S = 1LL * aa*bb;ans = max(ans, 1LL * (V / (n*m - S) + dep[c] - (V % (n*m - S) == 0))*S);}}}}printf("%lld\n", ans);}}?
總結
- 上一篇: uva12559
- 下一篇: uva1624knots