夢追い人

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

おまけ

ノーコンとなりましたが一応SRM504の報告

Easy

CやJavaなどで使われるような条件式を用いて数字に操作をした。

入力からすべての正しい出力がでるようなコードで一番短いコードの文字数を答える問題。
ひたすら条件分岐。

class ComparerInator {
   public:
   int makeProgram(vector <int> A, vector <int> B, vector <int> wanted)
  {
	int res = -1;
	vector <bool> program(4,true);
	for (int i=0; i<A.size(); i++) {
		if (program[0] && wanted[i] != A[i]) {
			program[0] = false;
		}
		if (program[1] && wanted[i] != B[i]) {
			program[1] = false;
		}
		if (program[2] && wanted[i] != min(A[i], B[i])) {
			program[2] = false;
		}
		if (program[3] && wanted[i] != max(A[i], B[i])) {
			program[3] = false;
		}
		if (!program[0] && !program[1] && !program[2] && !program[3]) {
			break;
		}
	}
	if (program[0] || program[1]) {
		res = 1;
	} else if (program[2] || program[3]) {
		res = 7;
	}
	return res;
  }
};

Medium

問題文のstackにだいぶつられ上手い案とか出てこなかった。

とりあえずなんか白玉とりだした時と黒玉取り出したときの操作が決められていてそれにしたがってボールを取り出していったときに黒を何回取らなければいけないか?

さて、僕なりの解釈で書いた絶対TLEしそうなコードがコチラ

class MathContest {
   public:
   int countBlack(string ballSequence, int repetitions)
  {
	int res=0;
	vector <string> balls(repetitions, ballSequence);
	string tmp = "";
	for (int i=0; i<balls.size(); i++) {
		for (int j=0; j<balls[i].length(); j++) {
			tmp = "";
			if (balls[i][j] == 'B') {
				balls[i][j] = ' ';
				for (int k=0; k<balls.size(); k++) {
					for (int l=0; l<balls[k].length(); l++) {
						if (balls[k][l] == 'W') {
							tmp += 'B';
						} else if (balls[k][l] == 'B'){
							tmp += 'W';
						}
					}
					balls[k] = tmp;
				}
				res++;
			} else {
				for (int k=0; k<balls.size(); k++) {
					for (int l=0; l<balls[k].length(); l++) {
						if (balls[k][l] == 'W') {
							tmp += 'W';
						} else if (balls[k][l] == 'B'){
							tmp += 'B';
						}
					}
					reverse(tmp.begin(), tmp.end());
					balls[k] = tmp;
				}
			}
		}
	}
	return res;
  }
};

ですが、どうやらあってる人がballSequenceをrepetitions回文つなげた長い文字列作ってる人が多い。。。すくなくともC++では。

とりあえず一番読みやかった正解例がコチラ。

class MathContest {
  public:
    int countBlack(string s, int rep) {
      int ans=0, low, high;
      int color=0, order=0;
      char c;

      low=0;
      high=s.length()*rep-1;
      while (low<=high) {
        if(order) {
          c=s[high%s.length()];
          high--;
        } else {
          c=s[low%s.length()];
        }
        if((c=='B' && !color) || (c=='W' && color)) {
          ans++;
          color+=1;
          color%=2;
        } else {
          order+=1;
          order%=2:
        }
     }
     return ans;
  }
};

colorで反転してるか、orderでリバースしてるか。
というかつなげて考えていいんですね。これだったら簡単だった・・・かも?

Hard

あるプログラムで塗り替えた出力結果から辞書順で一番小さい入力を求める問題。

重いっす。
結局、プログラムで評価されないところを基準に操作して順当に配列を求めそれをcheck関数つくって正しい入力か判断し、正しくなかったら空の配列を返そう!
みたいなのりでいいらしいです。

PKU

おまけなのにさらにおまけ。

正答率の高いものを解いてみる。

int main() {
	double c, tmp;
	while (cin >> c) {
		int i=1;
		double sum = 0;
		if (c == 0.0) {
			break;
		}
		while (true) {
			tmp = 1.0/(i+1);
			sum += tmp;
//			cout << tmp << endl;
			if (sum >= c) {
				break;
			}
			i++;
		}
		cout << i << " card(s)" << endl;
	}
}

これが1003

int main() {
	double mon, sum=0;
	string res = "$";
	for (int i=0; i<12; i++) {
		cin >> mon;
		sum += mon;
	}
	sum /= 12;
	stringstream ss;
	ss << sum;
	res += ss.str();
	cout << res << endl;
}

わぁ!なんだかんだでブログに時間掛けすぎた!

それではノシ