Gym - 101308B-二分或者暴力

给一个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;
}

“`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值