SRM 657 Div1 Easy Problem Sets

二分探索するだけ。

#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(int i=0;i<(int)(n);i++)
#define ll long long

class ProblemSets {
public:

bool judge(ll E,ll EM,ll M,ll MH,ll H,ll num){
    ll x=max(0ll,num-E);
    ll y=max(0ll,num-H);
    if(x>EM || y>MH) return false;
    if(num>=M && M+EM+MH-x-y<num) return false;;
    return true;
}

long long maxSets(long long E, long long EM, long long M, long long MH, long long H) {
	 ll lb=0;
     ll ub=E+EM+M+MH+H;
     while(ub-lb>1){
        ll mid=(lb+ub)/2;
        if(!judge(E,EM,M,MH,H,mid)) ub=mid;
        else lb=mid;
     }
     return lb;
}
}