TopCoder SRM 364 DIV 2
Problem | Check | Points |
250 | o | 230.30 |
600 | x | - |
1000 | - | - |
久しぶりにやったら死んだ。やっぱり実装ゲーはだめだ、ちゃんとC++勉強しなおさないと、いいデータ構造で書けない。
Problem 250
YRDK・・・だけど、mapへの代入方法はいつまでたっても覚えられないので、それを調べてるうちに時間がなくなってしまうという。
vector<string> split(const string& str, const string& delimiter) { // delimiter(2 文字以上も可) を空白に置換 string item(str); for(unsigned pos = item.find(delimiter); pos != string::npos; pos = item.find(delimiter, pos)) { item.replace(pos, delimiter.size(), " "); } // 分解 stringstream buf(item); // 読み取り vector<string> result; while(buf >> item) { result.push_back(item); } return result; } class MorselikeCode { public: string decrypt(vector <string> library, string message) { map<string, string> m; for(int i=0 ; i<library.size() ; i++){ vector<string> vs = split(library[i], ","); m.insert( map<string, string>::value_type( vs[1], vs[0] )); } vector<string> vmessage = split(message, ","); string ret; for(int i=0 ; i<vmessage.size() ; i++){ if(m.find(vmessage[i])!=m.end()) ret += m[vmessage[i]]; else ret += "?"; } return ret; } };
Problem 600
Test Caseに「AさんがAさんに攻撃する」というのがあって、対応できてなかった。else ifをifに変えたら通った、こういう場合が一番切ない。
vector<string> split(const string& str, const string& delimiter) { // delimiter(2 文字以上も可) を空白に置換 string item(str); for(unsigned pos = item.find(delimiter); pos != string::npos; pos = item.find(delimiter, pos)) { item.replace(pos, delimiter.size(), " "); } // 分解 stringstream buf(item); // 読み取り vector<string> result; while(buf >> item) { result.push_back(item); } return result; } class Person{ public: string name; string team; int point; Person(string s1, string s2, int a){ name = s1; team = s2; point = a; } void print(){ cout << name << " " << team << " " << point << endl; } }; class Team{ public: string team; int point; Team(string s, int a){ team = s; point = a; } }; bool personsort(Person p1, Person p2){ if(p1.point != p2.point) return p1.point > p2.point; return p1.name < p2.name; } bool teamsort(Team t1, Team t2){ if(t1.point != t2.point) return t1.point > t2.point; return t1.team < t2.team; } string IntToString(int number) { stringstream ss; ss << number; return ss.str(); } class Paintball { public: vector <string> getLeaderboard(vector <string> players, vector <string> messages) { vector<Person> vp; vp.clear(); for(int i=0 ; i<(signed)players.size() ; i++){ vector<string> v = split(players[i], ","); Person p(v[0], v[1], 0); vp.push_back(p); } for(int i=0 ; i<(signed)messages.size() ; i++){ vector<string> v = split(messages[i], ","); string winp = v[0]; string losep = v[2]; string winteam, loseteam; for(int j=0 ; j<(signed)vp.size() ; j++){ if (vp[j].name== winp) winteam = vp[j].team; if(vp[j].name== losep) loseteam = vp[j].team; } // 味方を攻撃した場合 if(winteam == loseteam){ for(int j=0 ; j<(signed)vp.size() ; j++){ if(vp[j].name==winp) vp[j].point--; } } // 敵チームを攻撃した場合(通常) else{ for(int j=0 ; j<(signed)vp.size() ; j++){ if(vp[j].name == winp) vp[j].point++; else if(vp[j].name == losep) vp[j].point--; } } for(int j=0 ; j<vp.size() ; j++){ vp[j].print(); } cout << endl; } vector<Team> vt; bool b=false; for(int i=0 ; i<(signed)vp.size() ; i++){ string s = vp[i].team; b = false; for(int j=0 ; j<(signed)vt.size() ; j++){ if(vt[j].team == s){ vt[j].point += vp[i].point; b = true; } } if(b) continue; Team t(s,vp[i].point); vt.push_back(t); } sort(vt.begin(), vt.end(), teamsort); vector<string> ans; for(int i=0 ; i<(signed)vt.size() ; i++){ ans.push_back( vt[i].team + " " + IntToString(vt[i].point) ); vector<Person> vvp; for(int j=0 ; j<(signed)vp.size() ; j++){ if(vt[i].team == vp[j].team) vvp.push_back(vp[j]); } sort(vvp.begin(), vvp.end(), personsort); for(int j=0 ; j<(signed)vvp.size(); j++){ ans.push_back( " " + vvp[j].name + " " + IntToString(vvp[j].point) ); } } return ans; } };