初看上去没太有思路,而且还是百度AStar网络预选赛的最后一题,不过想明白才发现,这题巨水无比。。。。就是一初中数学题
先贴代码,非常非常短
#include<iostream>
using namespace std;
int main(){
int n,m,d1,d2,number;
int minimum=999999;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>d1>>d2;
number=(d2*n)/(d1+d2)+1;
int goal=(d1+d2)*number-d2*n;
if(goal<minimum)
minimum=goal;
}
cout<<minimum<<endl;
return 0;
}
思路与分析:
由于按按钮的次数为固定的n,并且每次只能按up或者down,因此可设up的次数为x,则down的次数必为n-x
用d1来表示上升层数,d2来表示下降层数。
因为人不能钻入地下,也就是要求d1*x-(n-x)*d2的最小正整数值。
并且可以很容易发现,只要d1*x-(n-x)*d2为正数,总可以找到一种方案在不违背规则的情形下到达终点(先上升x次,再下降n-x次即可),也就是说上面的结论的确是正确的。
这样,求解d1*x-(n-x)*d2=(d1+d2)*x-n*d2>0就行了,在程序中就是number=(d2*n)/(d1+d2)+1这一行。
以上是针对一种情形求最小值,求出所有情形的解,并找一个最小值就得到答案了,很水吧。。。
不过百度貌似把题目翻译错了,不应该有0的情形。。。。