P2120 [ZJOI2007]倉庫建設
阿新 • • 發佈:2021-01-07
毒瘤題。。。之後找機會重寫下吧。。。畢竟現在的碼風慘不忍睹,而且\(\color{green}{AcWing}\)上只過了\(3\)個點=_=
注意分數相同的同學名次相同,並且小於當前分數的同學的名次依次向後遞進。
例如:1、1、3、4、5,而不是1、1、2、3、4。
const int N=2010; struct Stu { int c_rank,m_rank,e_rank,avg_rank; }a[N]; PII c[N],m[N],e[N]; unordered_map<string,int> mp; PDI avg[N]; int n,q; int main() { cin>>n>>q; for(int i=0;i<n;i++) { string id; cin>>id>>c[i].fi>>m[i].fi>>e[i].fi; avg[i].fi=(c[i].fi+m[i].fi+e[i].fi)/3.0; mp[id]=i; c[i].se=m[i].se=e[i].se=avg[i].se=i; } sort(c,c+n,greater<PII>()); sort(m,m+n,greater<PII>()); sort(e,e+n,greater<PII>()); sort(avg,avg+n,greater<PDI>()); int tot=1; for(int i=0;i<n;i++) { if(i && c[i].fi == c[i-1].fi) a[c[i].se].c_rank=a[c[i-1].se].c_rank; else a[c[i].se].c_rank=tot; tot++; } tot=1; for(int i=0;i<n;i++) { if(i && m[i].fi == m[i-1].fi) a[m[i].se].m_rank=a[m[i-1].se].m_rank; else a[m[i].se].m_rank=tot; tot++; } tot=1; for(int i=0;i<n;i++) { if(i && e[i].fi == e[i-1].fi) a[e[i].se].e_rank=a[e[i-1].se].e_rank; else a[e[i].se].e_rank=tot; tot++; } tot=1; for(int i=0;i<n;i++) { if(i && avg[i].fi == avg[i-1].fi) a[avg[i].se].avg_rank=a[avg[i-1].se].avg_rank; else a[avg[i].se].avg_rank=tot; tot++; } while(q--) { string id; cin>>id; if(!mp.count(id)) { puts("N/A"); continue; } int x=mp[id]; int rank=min(min(a[x].c_rank,a[x].m_rank),min(a[x].e_rank,a[x].avg_rank)); if(a[x].avg_rank == rank) cout<<rank<<' '<<'A'<<endl; else if(a[x].c_rank == rank) cout<<rank<<' '<<'C'<<endl; else if(a[x].m_rank == rank) cout<<rank<<' '<<'M'<<endl; else cout<<rank<<' '<<'E'<<endl; } //system("pause"); return 0; }