CodeForces 123B

来源:互联网 发布:matlab 解矩阵方程 编辑:程序博客网 时间:2024/05/16 14:00

题目链接:CodeForces 123B
周赛做的一道题,虽然看到数据量立马就想到了找规律,最后还是没找出来,不过确实是好题一道!

解题思路:
给你两个平面内的点,坐标可能很大,但是不会超过int,在平面内可以上下左右走,问你从( x1 , y1 )走到( x2 , y2 )最少可能经过坏点的数量(坏点即为满足| x + y | % 2a ==0 或者| x - y | % 2b == 0)
很明显的(可以在纸上稍微画个图),想要坏点最少,肯定就是在两个点之间走曲折的路线,而坏点所在的直线(我们称之为坏点线)其实是满足一定规律的,就是等间距(在跨象限的时候可能会有小小的不同)分布,这里盗个图用(点这里),该博客里面的图是不是很清晰呢(虽然走的方向有点问题,但是不得不说这图画的真是赞)?
画到这里其实就已经很明显了,要使两点之间的路线坏点最少,那么是不是得走坏点线的交点!于是答案就很明显了。这里还要注意一个问题,就是跨象限的问题(x+y=0 和 x-y=0),不过有一个小技巧可以很神奇的解决,详见代码(官方代码):

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int a, b, x1, y1, x2, y2;int x, y;int main(){    cin >> a >> b >> x1 >> y1 >> x2 >> y2;    x = x1; y = y1;    x1 = x + y;    y1 = y - x;    x = x2; y = y2;    x2 = x + y;    y2 = y - x;     a *= 2;    b *= 2;    x1 = x1 / a + (x1 > 0);//此处我们解决了跨象限的问题!    x2 = x2 / a + (x2 > 0);    y1 = y1 / b + (y1 > 0);    y2 = y2 / b + (y2 > 0);    cout << max(abs(y2 - y1), abs(x2 - x1)) << endl;    return 0;}

这里其实变换坐标了坐标系,但是其实差不多的啦。。。

总结:
1、做题的时候还是太急了,虽然被大一虐了,但是还是得淡定啊~~
2、多用纸思考,别老用脑瞎想。

0 0