【数学】poj3863business center&&2012百度AStar《百度的新大厦》

初看上去没太有思路,而且还是百度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的情形。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值