夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

なんなんだろう・・・

0+0+0=0
936->824
最悪。。。
復讐コード載せます。

Easy

同じ文字列をつなぎあわせる時、なるべく短くする。
substrでやったら落ちた。

class TwiceString {
public:
   string getShortest( string s ) {
	for (int i=1; i<s.length(); i++) {
		bool flag = true;
		for (int j=i; j<s.length(); j++) {
			if (s[j] != s[j-i]) {
				flag = false;
				break;
			}
		}
		if (flag) {
			cout << "ok" << endl;
			string res = s;
			for (int j=s.length()-i; j<s.length(); j++) {
				res += s[j];
			}
			return res;
		}
	}
	return s+s;
   }
};

Medium

ドウ考えても簡単なのにミスるひと
単純にその文字列から順に一番大きいアルファベットを取っていくだけ。

class LargestSubsequence {
public:
	string solve(int start, string s) {
		char tmp = 'a'-1;
		if (start == s.length()) return "";
		int mnum;
		for (int i=start; i<s.length(); i++) {
			if (tmp < s[i]) {
				tmp = s[i];
				mnum = i;
			}
		}
		string res = "";
		res += tmp;
		return tmp+solve(mnum+1, s);
	}
   string getLargest( string s ) {
	string res = solve(0, s);
	return res;
   }
};

Hard

期待値計算的な問題とか解いたこと無いから当然解けなかったわけです。
あとで他人のコードで通して、数分考えてようやく理解しました。

つまり、N枚のコインのうちa枚を裏返すとすると、表のコインが裏返る確率と、裏のコインが裏返る確率はどちらもa/Nなんですよね・・・
だから毎回期待値を計算していき、答えをだすだけ。

class CoinReversing {
public:
   double expectedHeads( int N, vector <int> a ) {
	double head = N, tail = 0.0;
	for (int i=0; i<a.size(); i++) {
		double h = head, t = tail;
		double ratio = (double)a[i] / (double)N;
		head = t * ratio + h - head * ratio;
		tail = t + h * ratio - tail * ratio;
	}
	return head;
   }
};

人権がない

精進が足りない・・・文化祭おわったらまた精進の日々だ。。。