TopCoder SRM 364 Div1 Easy Paintball
問題
n人がペイント球を投げる遊びをしている。
それぞれの人が所属するチームが与えられる。
また、誰が誰にボールを当てたかという情報も与えられる。
AがBにボールを当てたとき、AとBが違うチームならAに1点、Bに-1点が加わる。
AとBが同じチームなら、Aに-1点が加えられ、Bの点数は変化しない。
チームの得点は、チームのメンバー全員の得点の和である。
それぞれのチームの得点表を指定された形式で出力せよ。
チームは得点の多い順に(タイならアルファベット順に)、
チーム内のメンバーも得点の多い順に(タイならアルファベット順に)
並べて出力せよ。
制約条件
n≦50
ボールの情報≦50
方針
定義にしたがって実装する。
めんどい。
ソースコード
struct team{ string name; vector<pair<int,string> > mem; int sc; bool operator<(const team &o)const{ if(sc!=o.sc)return sc>o.sc; return name<o.name; } }; class Paintball { public: vector <string> getLeaderboard(vector <string> players, vector <string> messages) { vector<team> t; rep(i,players.size()){ stringstream ss(players[i]); team tmp; string tm, nm; ss>>nm>>tm; rep(j,t.size())if(t[j].name==tm){ t[j].mem.pb(mp(0,nm)); goto NEXT; } tmp.name=tm; tmp.mem.pb(mp(0,nm)); t.pb(tmp); NEXT:; } rep(i,messages.size()){ stringstream ss(messages[i]); string a,b,c; ss>>a>>b>>c; rep(i,t.size())rep(j,t[i].mem.size()){ if(t[i].mem[j].second==a){ t[i].mem[j].first--; rep(k,t[i].mem.size())if(t[i].mem[k].second==c) t[i].mem[j].first+=2, t[i].mem[k].first--; } if(t[i].mem[j].second==c)t[i].mem[j].first++; } } rep(i,t.size()){ t[i].sc=0; rep(j,t[i].mem.size())t[i].sc-=t[i].mem[j].first; sort(all(t[i].mem)); } sort(all(t)); vs ans; rep(i,t.size()){ char buf[100]; sprintf(buf,"%s %d",t[i].name.c_str(),t[i].sc); ans.pb(buf); rep(j,t[i].mem.size()){ sprintf(buf," %s %d",t[i].mem[j].second.c_str(), -t[i].mem[j].first); ans.pb(buf); } } return ans; } };