这道题非常有意思,主要是首先每一个元素都至少包含一个鼠标与键盘,所以说去除后实际上就只是各占一个而已。对于“相邻的两个无法拿相同的礼物”实际上就是“相邻约束”,根据鸽巢原理,如果某一个超过了一半的总数,那么就至少会有两个人拿到一样的果盘。由于我们只关心能不能而不是怎么分配,所以说我们直接使用一个limit = (总数 + 1) / 2即可,在可能的情况下都不可能超过这个数,之后看看加起来数量上能不能满足即可,比起写一堆约束条件来的方便多了
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int T;
cin>>T;
while(T--)
{
int a,b,c;
cin>>a>>b>>c;
int nn = min(a,b);
int l = 0;
int r = nn;
int ans;
while(l <= r)
{
int mid = l + (r - l) / 2;
int aa = a - mid;
int bb = b - mid;
//由于相邻的不能重复
//就是在最差的情况下至少有一个的大小占了一半
int limit = (mid + 1) / 2;
int aaa = min(limit,aa);
int bbb = min(limit,bb);
int ccc = min(limit,c);
if(aaa + bbb + ccc < mid)
{
r = mid - 1;
}
else
{
ans = mid;
l = mid + 1;
}
}
cout<<ans<<'\n';
}
return 0;
}

京公网安备 11010502036488号