Codeforces Round #459 (Div2)
A - Eleven
iがフィボナッチ数なら"O", そうでないなら"o".
メモ化再帰で解く.関数fib(int n)とメモ配列fib_memo.
i = 1 to nについてi == fib(counter)なら"O"とする.
counterの初期値を2にすると1がダブらなくて済む.
#include <iostream> using namespace std; long long int fib_memo[1000] = {0}; long long int fib(int n) { if(n == 0) return 0; if(n == 1 || n == 2) return 1; if(fib_memo[n] != 0) { return fib_memo[n]; } return fib_memo[n] = fib(n - 1) + fib(n - 2); } int main(void) { int n; cin >> n; int counter = 2; for(int i = 1; i <= n; i++) { if(i == fib(counter)) { cout << "O"; counter++; } else { cout << "o"; } } cout << endl; }
B - Radio Station
名前: name
名前と対応するip: ip
コマンド: command
コマンドと対応するip: ipcom
にstringで保存する.
配列ipの各要素の末尾に';'を加えてipcomの各要素と比較できるようにする.
ipcomの各要素と一致するipの要素を見つけて対応する名前を出力する.
#include <iostream> using namespace std; int main(void) { int n, m; cin >> n >> m; string name[n], command[m], ip[n], ipcom[m]; for(int i = 0; i < n; i++) { cin >> name[i] >> ip[i]; ip[i].push_back(';'); } for(int i = 0; i < m; i++) { cin >> command[i] >> ipcom[i]; } for(int i = 0; i < m; i++) { cout << command[i] << " " << ipcom[i]; for(int j = 0; j < n; j++) { if(ipcom[i] == ip[j]) { cout << " #" << name[j]; break; } } cout << endl; } }
C - The Monster
Editorialの擬似コードを実装してみたけど問題ページに載ってる例でうまく行かない。
"?("の場合が間違ってカウントされてるっぽいけどEditorialが間違ってる?
#include <iostream> using namespace std; int main(void) { string s; cin >> s; int n = s.length(); bool f[n + 1][n + 1]; bool g[n + 1][n + 1]; for(int l = 0; l < n; l++) { int cur = 0; bool ok; for(int r = l; r < n; r++) { ok = true; if(s[r] == ')') { cur--; } else { cur++; } if(cur < 0) { ok = false; } f[l + 1][r + 1] = ok; } } for(int r = 0; r < n; r++) { int cur = 0; bool ok; for(int l = r; l >= 0; l--) { ok = true; if(s[l] == '(') { cur--; } else { cur++; } if(cur < 0) { ok = false; } g[l + 1][r + 1] = ok; } } int ans = 0; for(int l = 1; l <= n; l++) { for(int r = l; r <= n; r++) { if(f[l][r] && g[l][r] && (r - l + 1) % 2 == 0) { cout << l << r << r - l + 1 << endl; ans++; } } } cout << ans << endl; }