题意:
有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;
}