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;
  }
};