夢追い人

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

SRM505おつかれさま&AOJのAC

今日はSRM505が日本人にとても参加しやすい時間(ついさっきまで)やっておりますた!

Div.2は250がゆとりだったんですが、なんか500でいろんな人が撃墜されていますた。。。

AOJ

とりあえずAOJから。一応2問程度?
まず0014が積分の近似を与えられた範囲でやるといったもの。

書くだけ。

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int main() {
	int d;
	while (scanf("%d", &d) != EOF) {
		long sum = 0;
		for (int i=d; i<600; i+=d) {
			sum += d*pow(i, 2);
		}
		cout << sum << endl;
	}
}

で、0015が長い桁の整数演算をしようというもの。

文字列として1桁ずつ地道に・・・

#include <iostream>
#include <string>

using namespace std;

int main() {
	int N; cin >> N;
	for (int i=0; i<N; i++) {
		string a, b;
		cin >> a >> b;
		int sum, ret=0;
		if (a.length() < b.length()) swap(a,b);
		int l = b.length()-1;
		for (int i=a.length()-1; i>=0; i--) {
			if (l >= 0) {
				sum = (a[i]-48)+(b[l]-48)+ret;
				l--;
			} else {
				sum = (a[i]-48)+ret;
			}
			if (sum>=10) {
				ret = 1;
				sum -= 10;
			} else {
				ret = 0;
			}
			a[i] = sum+48;
		}
		if (ret != 0) {
			a.insert(a.begin(), ret+48);
		}
		if (a.length() > 80) cout << "overflow" << endl;
		else cout << a << endl;
	}
	return 0;
}

ちょっとするめ練には軽すぎたかな?

SRM

Easy

これはゆとり。
英文を解析して文頭を大文字に直すもの。

頭っから判定してけばいい。

class SentenceCapitalizerInator {
   public:
   string fixCaps(string paragraph)
  {
	string ans = paragraph;
	bool head = true;
	for (int i=0; i<ans.length(); i++) {
		if (head) {
			ans[i] = toupper(ans[i]);
			head = false;
		} else if (ans[i] == '.') {
			head = true;
			i++;
		} else {
			head = false;
		}
	}
	return ans;
  }
};
Medium

なんか数字が与えられてそのうち一つの数字を入れ替えたときに積と和がいっちするような集合になるか判定する問題。

これが異常に撃墜されまくっていた。
僕もその内の一人。

一応僕なりの答え。

class PerfectSequences {
   public:
   string fixIt(vector <int> seq)
  {
	int p=1, s=0, tmp1, tmp2;
	if (seq.size() == 1) return "Yes";
	for (int i=0; i<seq.size(); i++) {
		p *= seq[i];
		s += seq[i];
	}
	if (p == s) return "No";
	for (int i=0; i<seq.size(); i++) {
		tmp1 = 1; tmp2 = 0;
		for (int j=0; j<seq.size(); j++) {
			if (j == i) continue;
			tmp1 *= seq[j];
			tmp2 += seq[j];
		}
		tmp1--;
		cout << tmp1 << ":" << tmp2 << endl;
		if (tmp2%tmp1==0 && tmp2/tmp1>=0) {
				return "Yes";
		}
	}
	return "No";
  }
};

結構気をつけるべきところは気をつけてた気がするのだが・・・

Hard

読解できたひとには楽らしい。

読解ゲー。
規則性はわからないがとにかくなんかでっかい長方形の中にちっちゃい長方形がしきつめられていたときすべてのちっちゃい長方形をもとめるには後何回質問すればいいか?

とにかくわからないままなんとなく書いたコード

class RectangleArea {
   public:
   int minimumQueries(vector <string> known)
  {
	int ans = 0, c = 0, N = known[0].length(), M = known.size();
	string tmp = "";
	for (int i=0; i<N; i++) tmp += 'Y';
	vector <string> good(M, tmp);
	if (known == good) return ans;
	for (int i=0; i<M; i++) {
		for (int j=0; j<N; j++) {
			c = 0;
			if (known[i][j] == 'N') {
				if (i-1 >= 0 && j-1 >= 0 && known[i-1][j-1] == 'Y') c++;
				if (i-1 >= 0 && known[i-1][j] == 'Y') c++;
				if (i-1 >= 0 && j+1 < N && known[i-1][j+1] == 'Y') c++;
				if (j-1 >= 0 && known[i][j-1] == 'Y') c++;
				if (j+1 < N && known[i][j+1] == 'Y') c++;
				if (i+1 < M && j-1 >= 0 && known[i+1][j-1] == 'Y') c++;
				if (i+1 < M && known[i+1][j] == 'Y') c++;
				if (i+1 < M && j+1 < N && known[i+1][j+1] == 'Y') c++;
				if (c >= ) {
					known[i][j] = 'Y';
					if (i-1 >= 0 && j-1 >= 0 && known[i-1][j-1] != 'Y') known[i-1][j-1] = 'Y';
					if (i-1 >= 0 && known[i-1][j] != 'Y') known[i-1][j] = 'Y';
					if (i-1 >= 0 && j+1 < N && known[i-1][j+1] != 'Y') known[i-1][j+1] = 'Y';
					if (j-1 >= 0 && known[i][j-1] != 'Y') known[i][j-1] = 'Y';
					if (j+1 < N && known[i][j+1] != 'Y') known[i][j+1] = 'Y';
					if (i+1 < M && j-1 >= 0 && known[i+1][j-1] != 'Y') known[i+1][j-1] = 'Y';
					if (i+1 < M && known[i+1][j] != 'Y') known[i+1][j] = 'Y';
					if (i+1 < M && j+1 < N && known[i+1][j+1] != 'Y') known[i+1][j+1] = 'Y';
				} else {
					ans++;
					known[i][j] = 'Y';
				}
			}
		}
	}
	for (int i=0; i<M; i++) cout << known[i] << endl;
	return ans;
  }
};