用前缀和写一直wa。。
思路:让金牌和银牌最少,通多增加铜牌的方式来扩大总奖牌的个数。
#include<bits/stdc++.h> using namespace std; map<int ,int >mp; const int N=1e6+7; int arr[N]; void solve() { mp.clear(); int n; cin>>n; int x; int pos=0; for(int i=1;i<=n;i++){ cin>>x; if(!mp[x]) arr[pos++]=x; mp[x]++; } if(pos<3) { cout<<"0 0 0"<<endl; return ; } int m=n/2; if(m<3) { cout<<"0 0 0"<<endl; return ; } int g=mp[arr[0]]; int b=0,c=0,posb,posc; int ansb=0; for(int i=1;i<pos;i++){ ansb+=mp[arr[i]]; if(ansb>g){ b=ansb; posb=i; break; } } if(b==0){ cout<<"0 0 0"<<endl; return ; } int ansc=0; for(int i=posb+1;i<pos;i++){ ansc+=mp[arr[i]]; if(ansc>g){ c=ansc; posc=i; break; } } if(c==0){ cout<<"0 0 0"<<endl; return ; } if(g+c+b>n/2){ cout<<"0 0 0"<<endl; return ; } while(g+b+c<=n/2){ c+=mp[arr[++posc]]; } c-=mp[arr[posc]]; cout<<g<<" "<<b<<" "<<c<<endl; } int main() { ios::sync_with_stdio(0); int t; cin>>t; while(t--) solve(); return 0; }