1264A - Beautiful Regional Contest
又双叒叕读错题意,感觉要二分想了半天还想离散化,离个大头:)
题目只需要g<s、g<b即可,要求最大化g+b+s
所以选数字最大的做金牌g,往后选择个数比g多的做银牌s,最后向后选到小于等于n/2处作为铜牌b。判断是否合法即可。
int t,n,g,s,b;
int a[maxn];
bool cmp(int a,int b){
return a>b;
}
int main(){
t=ird();
while(t--){
int sum=0;
n=ird();
for(int i=1;i<=n;i++)
a[i]=ird();
sort(a+1,a+1+n,cmp);
g=s=b=0;
a[n+1]=-1;
int f=1;
for(int i=1;i<=n;i++){
if(a[i]!=a[i+1]){
if(f==1){
g=i;
f=2;
}
else if(f==2){
if(i-g>g){
s=i-g;
f=3;
}
}
else{
if(i<=n/2&&(i-s-g)>g){
b=i-s-g;
f=4;
}
}
}
}
if(f==4)
cout<<g<<" "<<s<<" "<<b<<endl;
else
cout<<"0 0 0"<<endl;
}
return 0;
}