您的位置:首页 > 其它

Gym - 101308B-二分或者暴力

2017-04-07 10:38 477 查看
给一个m,n;

n是有n种电梯,开始在0层,这种电梯只能上升a层或者下降b层,问选择哪个电梯在操作m次后(可以上可以下)最后离0层最近。电梯不能换乘。输出最近的层数;

https://vjudge.net/contest/157355#problem/B

题目

方法:想象一个数组,数组有一个标志位,标志位前面是上升,后面是下降,数组长度为m(总操作数),二分求解就行。我一开始以为是拓展gcd,因为给的范围不小。。后来发现就是一个水题,但是暴力会有wa,因为我的暴力方法错了。

上二分的代码和暴力的代码;

#include <bits/stdc++.h>
using namespace std;
//偶然想到这道题,因为同时对gcd掌握也不好,顺便看看这个到底是咋二分的
/*下面会用一点简洁的代码来完成 这个。

*/
int main()
{   freopen("business.in","r",stdin);
freopen("business.out","w",stdout);

int m,n;
int a,b;
scanf("%d%d",&m,&n);
int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{   scanf("%d%d",&a,&b);
int l=0;
int r=m;
int mid;
/*想象一个区间,区间左面是l,右边是m,中间有一个标志,标志左面
是上升的,右边是下降的。 二分的判断条件是 mid*a-(b*m-mid*b);
if((m+n))
*/

while(l<=r)
{   mid=(l+r)/2;
//cout<<mid<<endl;
if(mid*a-b*m+mid*b>0)
{   r=mid-1;
}
else
l=mid+1;
}
//if(l*a-b*m+l*b>0)
ans=min(l*a-b*m+l*b,ans);

}
cout<<ans<<endl;

return 0;
}


#include <iostream>//暴力
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{   freopen("business.in","r",stdin);
freopen("business.out","w",stdout);

int m,n;
int a,b;
while(~scanf("%d%d",&m,&n))
{   int ans=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{   scanf("%d%d",&a,&b);
int x=a+b;
int y=b*m;
int c=y/x;
if(c*(a+b)-m*b<=0) c++;
ans=min(c*(a+b)-m*b,ans);
}
cout<<ans<<endl;
}
return 0;
}


“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: