A. Who Can Win
哎出大锅了
贪心,先求出封榜前通过题数最多且罚时最少的队伍,假定某个队伍封榜后所有的题目都是第一发交了就过
先按时间排个序
需要注意:
1.去重
2.计算罚时:显示accepted还要计算之前没过导致题目罚时,而如果这个题目没通过的话就不计算罚时
3.对于封榜后的提交也要正确计算罚时,即之前rejected的罚时也要加上去
4.对于队伍名称要按字典序排序
struct node{
string na;
char tm;
int tim;
string zt;
};
bool cmp(const node&a,const node&b){
return a.tim<b.tim;
}
void solve(){
int n;cin>>n;
vector<node>a(n+1);
rep(i,1,n){
cin>>a[i].na>>a[i].tm>>a[i].tim>>a[i].zt;
}
sort(a.begin()+1,a.end(),cmp);
map<string,set<char>>ac;
map<string,int>fs;
map<string,map<char,int>>mp;
map<string,set<char>>mtg;
map<string,int>mfs;
rep(i,1,n){
string name =a[i].na;
char tm =a[i].tm;
int time =a[i].tim;
string res =a[i].zt;
if(ac[name].count(tm))continue;
if(res=="Accepted"){
fs[name] += time;
ac[name].insert(tm);
}else if(res=="Rejected"){
mp[name][tm]++;
}else{
if(mtg[name].count(tm))continue;
mtg[name].insert(tm);
mfs[name]+=time;
mfs[name]+= mp[name][tm]*20;
}
}
for(auto[x,y]:ac){
for(auto ele:y){
if(mp[x].count(ele)){
fs[x]+=mp[x][ele]*20;
}
}
}
int fashi=1e18;
int tg=0;
for(auto[x,y]:ac){
int cnt=y.size();
if(tg==cnt){
fashi=min(fashi,fs[x]);
}else if(cnt>tg){
tg=cnt;
fashi=fs[x];
}
}
vector<string>ans;
for(auto[x,y]:ac){
if(tg==y.size()&&fashi==fs[x]){
ans.pb(x);
continue;
}
int add = mtg[x].size();
if(add+y.size()>tg){
ans.pb(x);
}else if(add+y.size()==tg){
int tot =fs[x]+mfs[x];
if(tot<=fashi){
ans.pb(x);
}
}
}
sort(ans.begin(),ans.end());
for(auto s:ans){
cout<<s<<' ';
}
cout<<endl;
}

浙公网安备 33010602011771号