http://codeforces.com/problemset/problem/123/B
这题让我深深体会到数学的重要性,做了两天.....
现在理解起来比较轻松了,首先两个点分别引出两条直线,一条斜率为1,另一条斜率为-1,在这个矩形中的坏点就是最少的了,那怎么求呢?
其实经过坏点的同时也必须经过里面的直线(斜率都是+-1),因此要数经过多少条斜率为1的直线和斜率为-1的直线,因为之前已经有一个矩形限定住了,根据直线的截距式,把截距算出来,再作差就好了。
最后还有一个地方要注意,假如两个截距相乘小于0,还要经过一个坏点(0,0),那么判断截距相乘如果直接用乘法会爆,可以用一个巧妙地办法解决,就是凡事截距大于0的都加一,最后再相减,就可以达到目的了!
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> //不加这个还会错的.......标程真是够了 6 7 using namespace std; 8 9 int main() 10 { 11 int a, b, x1, y1, x2, y2; 12 while(cin >> a >> b >> x1 >> y1 >> x2 >> y2) 13 { 14 a*=2, b*=2; 15 //截距 16 int B1 = y1 - x1; 17 int B2 = y2 - x2; 18 int A1 = y1 + x1; 19 int A2 = y2 + x2; 20 21 x1 = B1 / b + (B1 > 0); 22 x2 = B2 / b + (B2 > 0); 23 y1 = A1 / a + (A1 > 0); 24 y2 = A2 / a + (A2 > 0); 25 26 cout << max(abs(x2-x1), abs(y2-y1)) << endl; 27 } 28 29 return 0; 30 }