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;
}