@tenlee
2015-07-25T09:26:19.000000Z
字数 1327
阅读 1805
HDUOJ 题解
见题
任何矩形都可以分为宽度为1的小矩形,所以只考虑矩形的可以的最小长度即可。
讨论:
输入的时候先输入行,在输入列,当行比列大的时候要交换
任何矩形都可以分为宽度为1的小矩形,所以只考虑矩形的可以的最小长度即可。宽度始终为
当没有删除格子时,最小的面积是
当 x,y处于矩形正中央时 ans- 1即可
其他情况:
如果m > n swap(n,m), swap(x,y)
之后如图所示,上下取大的 e,左右取小的f
面积就应该为 ans2 = min(e, f)
如果这个 ans2 比 最小面积ans小,肯定输入ans
否则就是 ans2
//Author LJH//www.cnblogs.com/tenlee#include <cstdio>#include <cstdlib>#include <cstring>#include <cctype>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#define clc(a, b) memset(a, b, sizeof(a))using namespace std;const int inf = 0x3f;const int INF = 0x3f3f3f3f;const int maxn = 1e6+5;inline int mymin(int x, int y){return x < y ? x : y;}inline int mymax(int x, int y){return x > y ? x : y;}int main(){//freopen("Mul2/data/data1002/b.in", "r", stdin);//freopen("2.out", "w", stdout);int n, m, x, y;int le, ri, up, down;int e, f, g;int ans = 0;while(~scanf("%d %d %d %d", &m, &n, &x, &y)){if(m > n)//n为长边,m为短边{swap(n, m); swap(x, y);}le = y - 1;//删除的格子距左端的距离ri = n - y; //删除的格子距右端的距离e = mymin(le, ri);up = x - 1; //删除的格子距上端的距离down = m - x;//删除的格子距下端的距离f = mymax(up, down);g = mymin(e+1, f);ans = (m+1) / 2;//没有删除格子时,最小的面积if(le == ri && ri == up && up== down)//如果n,m为奇数,且删除的格子在正中间{printf("%d\n", le);}else{printf("%d\n", mymax(ans, mymin(e+1, f)));}}return 0;}