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