codeforces 304D. Rectangle Puzzle II(设计矩形)

http://codeforces.com/problemset/problem/304/D

大致题意:给出n, m, x, y, a, b(1 ≤ n, m ≤ 109, 0 ≤ x ≤ n, 0 ≤ y ≤ m, 1 ≤ a ≤ n, 1 ≤ b ≤ m)。在范围是(0,0)<-->(n,m)的矩形原区域找出包含(x,y)的(x1,y1)<-->(x2,y2)矩形满足:  (矩形是用左下角和右上角表示)

思路:a,b比例关系再联系n,m可以确定最大的矩形。矩形出来后,开始是以(x,y)为中心的,然后处理边界,上下左右四个方向移动,最后对于长和高是偶数的情况特殊处理(左移或下移)

#include <iostream>
#include <cstdio>
using namespace std;
int n,m,x,y,a,b;
int gcd(int p1,int p2){
    return p2==0?p1:gcd(p2,p1%p2);
}
int main()
{
    while(~scanf("%d%d%d%d%d%d",&n,&m,&x,&y,&a,&b)){
        int gd=gcd(a,b);
        a=a/gd;   b=b/gd;
        int len_rate=n/a,wid_rate=m/b;
        int change=min(len_rate,wid_rate);
        int len=change*a, hei=change*b;  //面积最大化
        int x1=x-len/2,x2=x+(len-len/2);  //中心化
        int y1=y-hei/2,y2=y+(hei-hei/2);
        if(x1<0){
            int d=-x1;
            x1=0;
            x2+=d;
        }
        if(y1<0){
            int d=-y1;
            y2+=d;
            y1=0;
        }
        if(x2>n){
            int d=x2-n;
            x1-=d;
            x2=n;
        }
        if(y2>m){
            int d=y2-m;
            y2=m;
            y1-=d;
        }
        if(x1>0&&(x2-x1+1)%2==0&&x==(x1+x2)/2){ //字典最小
            x1--;  x2--;
        }
        if(y1>0&&(y2-y1+1)%2==0&&y==(y1+y2)/2){
            y1--;  y2--;
        }
        printf("%d %d %d %d\n",x1,y1,x2,y2);
    }
    return 0;
}



你可能感兴趣的:(几何)