天下一プログラマーコンテスト2012 予選C「B - ロイヤルストレートフラッシュ」

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;
}

ブラックバイスクル

ブラックバイスクル

  • メディア: スポーツ用品