dwacon2017
ARC065は忘年会中で参加できず、2週間ぶりのプロコン参加……だが、浴槽内で寝るという失態を犯しまさかの1時間遅れ。 unratedなので素直に出場したが、結局1完という結果に終わる。
A
a+b-n>0 ? a+b-n : 0;
一丁前に三項演算子を使ってみたが、条件式を評価式にまた記載するのは明らかにダサい。
max(a+b-n, 0);
TLに流れてきたこちらの方が圧倒的に綺麗だった。maxとminの存在は忘れがちなので今後の反省点。
B
奇数起点・偶数起点の2パターンに分けられるというのは比較的早く感じ取れたものの、それを?の塊に着目してしまったため必要以上に難しく考えてしまうことに……。
?を埋めた後でニコニコレベルの判定を行うコードを書いている最中、「そもそも?の段階で判定できるのでは」とようやく気づいた。終了直後である。
文字列をTとして、T[0]およびT[1]を起点に25,2?,?5,??のどれかに当てはまるものが連続する回数を数え、大きい方を採用すればよい。
#include <iostream> #include <algorithm> using namespace std; int main() { string s; cin >> s; int len = s.length(); int ans = 0; int tmp = 0; for(int i = 0; i < len/2; i++){ if((s[i*2] == '2' && (s[i*2+1] == '5' || s[i*2+1] == '?')) || (s[i*2] == '?' && ( s[i*2+1] == '5' || s[i*2+1] == '?'))){ tmp += 2; }else{ tmp = 0; } if(tmp > ans) ans = tmp; } tmp = 0; for(int i = 0; i < (len-1)/2; i++){ if((s[i*2+1] == '2' && (s[i*2+2] == '5' || s[i*2+2] == '?')) || (s[i*2+1] == '?' && ( s[i*2+2] == '5' || s[i*2+2] == '?'))){ tmp += 2; }else{ tmp = 0; } if(tmp > ans) ans = tmp; } cout << ans << endl; return 0; }
無駄が多すぎるなんてモノではないぐらいお粗末なコードなので、後で直す。
C
深く考えず貪欲法で実装すればいい気がするが、いまいちコードに落とし込めず……。vectorを使おうとしたものの探索や削除がいまいち使いこなせなかった。明らかにデータ構造の勉強が必要っぽい。
結果
Aのみの1完。終了後16分遅れでBがACになった。
1時間遅れなので実質2完という事にしたいが、間に合っていないものは間に合っていないので仕方ない。
反省
- やるからにはunratedでも定時から参加する
- max,minの存在を忘れない
- 与えられた文字列全体に着目してみる
- STLをある程度使いこなせるようにする