GCJの合間に、こんなのも出ております。
一応Round1も通過して次はRound2という状態。
この予選は、残念ながら本番中にEが解けず…。
http://codeforces.com/contest/291/problem/A
http://codeforces.com/contest/291/problem/B
A. Spyke Talks
複数の人があるIDを使って互いに通話している。
ID=0は通話をしてない状態であり、0以外で同じIDが3人以上いると混戦して通話にならない。
成立している通話の数を答える。
mapを使って2人同じIDがいる組み合わせを数えるだけ。
ID=0は複数人いてもいいのが忘れがち。
void solve() { int f,r,i,j,k,l,x,y; int ma=0; int N = GETi(); map<int,int> M; FOR(i,N) { j=GETi(); M[j]=M[j]+1; } f=0; for(map<int,int>::iterator mit=M.begin();mit!=M.end();mit++) { if(mit->first==0) continue; if(mit->second>2) { _P("-1\n"); return; } if(mit->second==2) f++; } _P("%d\n",f); return; }
B. Command Line Arguments
コマンドラインの文字列をパースする問題。
通常スペースは単語の区切りになるが、ダブルクォーテーションで囲まれた文はスペースがあっても良い。
ダブルクォーテーションの内外に気を付けて状態遷移を書いていくだけ。
void solve() { int f,r,i,j,k,l,x,y; char st[100002]; gets(st); l=strlen(st); j=x=0; FOR(i,l) { //rem crlf if(j==0) { if(st[i]==' ') { if(x>0) _P(">\n"); x=0; } else if(st[i]=='"') { _P("<"); j=1; } else { if(x==0) _P("<"); _P("%c",st[i]); x++; } } else { x=0; if(st[i]=='"') { _P(">\n"); j=0; } else _P("%c",st[i]); } } if(j==0 && x>0) _P(">\n"); return; }
まとめ
どちらも落ち着いてやれば簡単な問題だけど、Aで問題文の読み落としをしてミスしたり、Bで出力にゴミが混ざって落とすなど、しょうもないミス連発。
これだから自分はTopCoderでEasyすらポロポロ落とすのだ…。