Quiz
https://atcoder.jp/contests/tenka1-2012-qualC/tasks/tenka1_2012_10
AC code
https://atcoder.jp/contests/tenka1-2012-qualC/tasks/tenka1_2012_10
解説
- どの絵柄でロイヤルストレートフラッシュを目指すのが1番速いのかを先に求めておく必要がある
- 1番早く揃えられる絵柄が分かったら、上からめくっていき、役以外は捨てる
- 前処理として、入力される文字列sを「絵柄、値」の組のvectorに変換した
- 例
// 変換前 s = H2H3H4SAS10SJSQSKD2D3D4 // 変換後 [V]: {(1, 2), (1, 3), (1, 4), (0, 1), (0, 10), (0, 11), (0, 12), (0, 13), (2, 2), (2, 3), (2, 4)}
感想
- やるだけ問題
- 解説が用意されていない。2012年はそういうものなのかな
code
ll s_to_v(string s){ if(s=="A") s = "1"; if(s=="J") s = "11"; if(s=="Q") s = "12"; if(s=="K") s = "13"; return stoll(s); } const string marks = "SHDC"; ll mark_to_v(char c){ return marks.find(c); } ll ss_to_v(stringstream& ss){ ll v = s_to_v(ss.str()); ss.str(""); return v; } string v_to_str(ll v){ if(v==1) return "A"; if(v==11) return "J"; if(v==12) return "Q"; if(v==13) return "K"; return to_string(v); } void trash(PII pa){ ll m = pa.first; ll v = pa.second; cout << marks[m] << v_to_str(v); } int main(){ cin.tie(0); ios::sync_with_stdio(false); // input string s;cin>>s; ll L = s.size(); vector<pair<ll,ll>> V; ll mark; stringstream ss; rep(i,L){ char c = s[i]; if(c=='S' || c=='H' || c=='D' || c=='C'){ debug(mark); if(ss.str().size()!=0){ ll v = ss_to_v(ss); V.push_back(MP(mark, v)); } mark = mark_to_v(c); // next mark }else{ ss << c; } } V.push_back(MP(mark, ss_to_v(ss))); ll N = V.size(); debug(V); // どのマークで揃えるのが一番早い? mark = -1; ll min_t = inf; rep(m,4){ set<ll> se; // 10,11,12,13,1 rep(i,N){ if(V[i].first!=m) continue; ll v = V[i].second; if(v==1 || v==10 || v==11 || v==12 || v==13){ se.insert(v); if(se.size()==5){ ll t = i; if(t < min_t){ mark = m; min_t = t; } } } } } debug(mark, min_t); if(min_t==4){ p(0); return 0; } rep(i,min_t+1){ ll m = V[i].first; if(mark!=m){ trash(V[i]); continue; } ll v = V[i].second; if(v==1 || v==10 || v==11 || v==12 || v==13){ // take }else{ trash(V[i]); } } cout << endl; return 0; }