TopCoder SRM 499 DIV2

Rating: 894→859(灰)
下がりました。はい。まあ当然ですね…
500と950落とされた。まあたしかによくよく考えれば分かる事だったんだけど、一応全部解けた気でいたから、ショック…

234.89 Points

250: SimpleGuess

234.89 Points

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class SimpleGuess {
public:
	int getMaximum(vector <int> hints) {
		sort(hints.begin(), hints.end());
		int maximum = 0;
		for(int i = 0; i < hints.size(); i++){
			for(int j = i + 1; j < hints.size(); j++){
				if(!((hints[i] + hints[j]) % 2) && !((hints[j] - hints[j]) % 2)){
					int X = (hints[i] + hints[j]) / 2, Y = (hints[j] - hints[i]) / 2;
					maximum = max(maximum, X * Y);
				}
			}
		}
		return maximum;
	}
};

ベタな解法。当初ソートし忘れたりしていて、それで少し時間くった。

500: ColorfulRabbits

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <cmath>
using namespace std;

class ColorfulRabbits {
public:
	int getMinimum(vector <int> replies) {
		map<int, int> ma;
		for(int i = 0; i < replies.size(); i++){
			ma[replies[i]]++;
		}
		
		int res = 0;
		for(map<int, int>::iterator it = ma.begin(); it != ma.end(); it++){
			int a = (*it).first, b = (*it).second;
			res += (a + 1) * (int)ceil((double)b / (a + 1));
		}
		return res;
	}
};

上は修正後のソース。
さっきよく見たらちゃんと一般化して考えられてなかった。ダメじゃん…。
大筋ではあってない事もなかったのに、勿体ない。

950: PalindromeGame

うまくいってると思ったのにうまくいかなかった。カード単体が回文になってるケースはたしかに考慮してなかったけど…
デバッグできた。イテレータ構文にイマイチ慣れきれてないのとか、複合要因でした。

// System Test Passed
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
class PalindromeGame {
public:
	int getMaximum(vector <string> front, vector <int> back) {
		vector<pair<int, string> > v(front.size());
		for(int i = 0; i < front.size(); i++){
			v[i] = make_pair(back[i], front[i]);
		}
		sort(v.begin(), v.end(), greater<pair<int, string> >());

		int total = 0;
		int f = 0;
		while(!v.empty()){
			int fd = 0;
			vector<pair<int, string> >::iterator beg = v.begin();
			string t = (*beg).second;
			reverse(t.begin(), t.end());
			for(vector<pair<int, string> >::iterator it = v.begin() + 1; it != v.end(); it++){
				if((*it).second == t){
					total += (*beg).first + (*it).first;
					v.erase(it);
					fd = 1;
					break;
				}
			}
			if(!fd && !f){
				if(t == (*beg).second){
					total += (*beg).first;
					f = 1;
				}
			}
			v.erase(beg);
		}
		return total;
	}
};