Codeforces 123B. Squares

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 }

 

posted @ 2015-03-24 21:56  dominjune  阅读(207)  评论(0编辑  收藏  举报