题意:给定a b c,划分3个集合,使得a和c不在同一集合,且使最大的集合最小
虽然题目简单,但一定要考虑仔细啊T^T
题解:由于a b c只有3000,可以直接二分solve
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
int a,b,c;
bool check(int x){
if(x<a&&x<c) return 0;
if(x>=a&&2*x>=(c+max((b-(x-a)),0))) return 1;
if(x>=c&&2*x>=(a+max((b-(x-c)),0))) return 1;
return 0;
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d%d%d",&a,&b,&c);
int l=1,r=max(a,max(b,c)),ans=inf;
int m;
while(l<=r){
m=(l+r)>>1;
// printf("l:%d r:%d m:%d\n",l,r,m);
if(check(m)){
ans=min(ans,m);//
r=m-1;
}else{
l=m+1;
}
}
printf("%d\n",ans);
}
return 0;
}
直接贪心也可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
int a,b,c;
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d%d%d",&a,&b,&c);
int ans;
if(a>c) swap(a,c);
if(b+c<=2*a){
ans=max(a,(b+c+1)/2);
}else{
int x=(b+c-2*a+2)/3;
if(x>b) ans=max(b+a,(c+1)/2);
else ans=x+a;
}
printf("%d\n",ans);
}
return 0;
}