题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593
5A级别的题目,彻底败给她了。让哥纠结了一个星期了!
起初我是先把A与B的距离缩短(减c,a,b,减的越多越好),然后留下的一段距离用广度搜索(a,-a,b,-b,c,-c),结果很惨,预设的队列完全不够用,想想就应该知道的,6的8次方已经是多少了呀!根本不能往下探多少步……
然后换个方法,总结出问题的通式:ax+by=d. d是|A-B|。发现这不就是求不定方程的整数解嘛!a,b都已知了,剩下的就是找单调性,代入整数比较大小,可不幸的是,哥哥又错了:求出来x,y确直接绝对值相加了,完全忘了还有c=a+b这种走法……
无奈,只能从CP大神的解题报告中求方法了,链接如下:http://blog.sina.com.cn/s/blog_5123df350100zk1d.html根据大神的方法,四个公式依次求解,然后找最小值,不过,还是没成功……大神的讲解中没说怎么判断“走不通”的情况,于是,我就从1开始依次代入,代到百万级还没解就判定此公式无整数解……超时了!
最后,又搜到了一篇总结,链接:http://hi.baidu.com/codeblood/blog/item/a6a6186c0f1453ff8cb10d1b.html
总算得救了,发这博客的哥们把解题思想说的很细,佩服。但还是有一点儿不明白的,就是判断最小值时,“而最小值只有当(x==y)时或者 (x==0, y) 或者(x, y==0)(==代表 接近)”这句话的理论依据是什么?还有代码中“k=(y-x)/(addx+addy);”的依据又是什么?