Description
分配奖牌:
回答的问题数:🏅️ > 🥈 > 🥉 > 没有获奖的
g + s + b <= n / 2
g < s , g < b
p1 >= p2 >= p3 … >= pn
To maximize (g + s + b)
Solution
如果有多种答案,只输出一种:
- 尽可能使金牌最少: 一个或者多个相同的
- 银牌的数也尽可能少,并且多于金牌
- 剩下的分给铜牌就好
由于铜牌的回答问题数要多于没获奖的,不能相同,以 n / 2为界向左找,相同的不要
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
using namespace std;
int p[400100],t,n,g,s,b;
bool C(int x){
int sn;
for (int i = 1; i <= x; ++i) {
if(p[i] == p[1]) g++;
else{
if(s <= g || p[i] == sn){
s++;
sn = p[i];
}
else{
b++;
}
}
}
if(g >= b || g >= s) return 0;
return 1;
}
void solve(){
int m = n / 2;
g = s = b = 0;
while (m > 1 && p[m] == p[m+1]) {
m--;
}
if(C(m)) printf("%d %d %d\n",g,s,b);
else puts("0 0 0");
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 1;i <= n;++i) {
scanf("%d", &p[i]);
}
solve();
}
return 0;
}