二分--CodeForces 626C--- Block Towers--

27 篇文章 0 订阅

题意:

 有A,B两组学生。 A学生n个人 可以搭2的倍数的高塔, B学生m人 可以搭3的倍数的高塔。但是不可以有两个学生塔同样高;求可以用的最少的积木个数搭建的最高的塔 有多高?

思路:

 搭 2. 搭 3 同高的会是6的倍数。那么将6的倍数分别讨论即可:

  方法一:

A学生一组可以搭的最矮的塔为 2*n 高

B学生一组可以搭的最矮的塔是3*n高

为了保证塔高最矮: 那么将6的情况分给 A B组中较高的一组。

  代码给注释

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        n*=2; A能搭的最高的
        m*=3; B能搭的最高的
        int i;
 
       for(i=6;i<=min(n,m);i+=6)
        {
            if(n>m) 如果此时A比B最大高度高 那么给B增加
                m+=3;
            else     同理
                n+=2;
        }
        printf("%d\n",max(n,m));
    }
}

方法二: 二分法

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m;
bool judge(int x)
{
    //二分循环传参高度值,判断值是否满足条件
    if(x<n*2||x<m*3||(x/2+x/3-x/6<m+n))
        return false;
    return true;
}

int main()
{

    cin>>n>>m;
    int l=0,r=(m+n)*6;
    int ans;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(judge(mid))
        {
            r=mid;
            ans=mid;
        }
        else
        {
            l=mid+1;

        }

    }
    cout<<ans<<endl;
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值