题意:有n个人用2米高的木板堆塔,有m个人用3米高的木板堆塔。木板可以随便使用,要求任意两人堆成塔的高度不一,问满足该条件下所有人堆成塔的最大高度的最小值。
思路:最...的最...,二分就好了。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <string>
#define INF (2000000000+10)
#define eps 1e-8
#define MAXN (200000+10)
#define MAXM (600000+10)
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%.2lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while((a)--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define LL long long
#define lson o<<1, l, mid
#define rson o<<1|1, mid+1, r
#define ll o<<1
#define rr o<<1|1
#define PI acos(-1.0)
#pragma comment(linker, "/STACK:102400000,102400000")
#define fi first
#define se second
using namespace std;
typedef pair<int, int> pii;
bool judge(int o, int n, int m)
{
int num1 = o / 2;
int num2 = o / 3;
int num3 = o / 6;
return n <= num1 && m <= num2 && n + m <= num1 + num2 - num3;
}
int main()
{
int n, m; Ri(n); Ri(m);
int l = 0, r = 8000000, ans;
while(r >= l)
{
int mid = (l + r) >> 1;
if(judge(mid, n, m))
{
ans = mid;
r = mid-1;
}
else
l = mid+1;
}
Pi(ans);
return 0;
}