年中春休み

年中春休みじゃないです。

競技プログラミング 5 (参加 ABC 055)

abc055.contest.atcoder.jp


ABC 055に参加しました。
都合により22時には寝ないといけない状況だったので途中までしか解けませんでした。
D問題の解法思いつくのが後20分くらい早かったら…。
ただミスしまくってDの実装に思いの外時間をかけてしまったので、本番フルタイムで使えていてもギリギリだったと思います。



A問題
普通にやりました。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
 
int main() {
	int n;
	cin >> n;
	cout << 800 * n - (n / 15) * 200 << endl;
	return 0;
}



B問題
10^9+7の余りにしなきゃいけないことを忘れていて少し時間がかかりましたが後は出来ました。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
 
int main() {
	ll n;
	cin >> n;
	ll ans = 1;
	for (ll i = 1; i <= n; i++) {
		ans *= i ;
		ans %= (ll)1000000007;
	}
	cout << ans << endl;
	return 0;
}



C問題
四則演算で出来るのにループで答えを出そうとしてTLEが出てしまいました。
いつもの悪い癖なので直していきたい…。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
 
int main() {
	ll n, m;
	ll ans = 0;
	cin >> n >> m;
		if (2 * n > m) {
			ans += m / 2;
		} else {
			ans += n;
			m -= n * 2;
			ans += m / 4;
		}
	cout << ans << endl;
	return 0;
}



D問題
解法は時間内に思いついたのですが、あと5分以内で書かないと間に合わないという状況だったので後は寝ながらコードを考えていたんですが、昨日はやる暇がなかったので今日書きました。
すごく煩雑になってしまったのですが、もっとスマートに書けたんじゃないかなと思っています。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
 
int n;
string s, t;
 
string f(string t) {
	int a = 0;
	for (int i = 1; i < n - 1; i++) {
		if (t[i] == 'S') {
			if (s[i] == 'o') {
				t += t[i - 1];
			} else if (t[i - 1] == 'S') {
				t += 'W';
			} else {
				t += 'S';
			}
		} else {
			if (s[i] == 'x') {
				t += t[i - 1];
			} else if (t[i - 1] == 'W') {
				t += 'S';
			} else {
				t += 'W';
			}
		}
	}
	if (t[0] == 'S') {
		if (s[0] == 'o' && t[1] == t[n - 1]) {
			a = 1;
		} else if (s[0] == 'x' && t[1] != t[n - 1]) {
			a = 1;
		} else {
			t = "X";
			return t;
		}
	}
	if (t[0] == 'W') {
		if (s[0] == 'x' && t[1] == t[n - 1]) {
			a = 1;
		} else if (s[0] == 'o' && t[1] != t[n - 1]) {
			a = 1;
		} else {
			t = "X";
			return t;
		}
	}
	if (a==1 && t[n-1] == 'S') {
		if (s[n-1] == 'o' && t[n-2] == t[0]) {
			return t;
		} else if (s[n-1] == 'x' && t[n-2] != t[0]) {
			return t;
		} else {
			t = "X";
			return t;
		}
	}
	if (a==1 && t[n-1] == 'W') {
		if (s[n-1] == 'x' && t[n-2] == t[0]) {
			return t;
		} else if (s[n-1] == 'o' && t[n-2] != t[0]) {
			return t;
		} else {
			t = "X";
			return t;
		}
	}
}
 
int main() {
	cin >> n >> s;
	string ans;
	ans = f("SS");
	if (ans != "X") {
		cout << ans << endl;
		return 0;
	}
	ans = f("SW");
	if (ans != "X") {
		cout << ans << endl;
		return 0;
	}
	ans = f("WW");
	if (ans != "X") {
		cout << ans << endl;
		return 0;
	}
	ans = f("WS");
	if (ans != "X") {
		cout << ans << endl;
		return 0;
	}
	if (ans == "X") {
		cout << -1 << endl;
	}
	return 0;
}




一つ一つの問題を解くのにめちゃくちゃ時間がかかっているのでもっと早く問題を解けるようになるといいなと思います。
後はしょうもないミスを減らしていきたい。