読者です 読者をやめる 読者になる 読者になる

AOJ 0152 Bowling

問題

Bowling

解法

シュミレーションの問題でいいんだよね。

ストライクとスペアに関するフラグを立てて、

  1. 2倍足す(f--);
  2. 1と一緒
  3. 3倍足す(f=1);

って処理してく。10フレーム目はめんどくさい。 実装量が多いというか、きれいなコードにならなかった。

コード

struct P{
  int n, p;
  P(int n, int p):n(n),p(p){};
  bool operator<(const P& r)const{
    return p == r.p ? n > r.n : p < r.p;
  }
};

int m;

int solve(int *f, int n){
  int res = 0;
  if(*f == 1 || *f == 2){ res = n*2; (*f)--;}
  else if(*f == 3){ res = n*3; *f = 1;}
  else res = n;
  return res;
}

int main(){
  while(scanf("%d", & m) && m){
    int a, b, sf, sum, n;
    priority_queue<P>q;
    rep(i, m){
      sf = sum = 0;
      scanf("%d", &n);
      rep(j, 9){
    scanf("%d", &a);
    sum += solve(&sf, a);
    if(a == 10){ sf += 2; continue;}

    scanf("%d", &b);
    sum += solve(&sf, b);
    if(a + b == 10){ sf += 1; continue;}

      }
      scanf("%d", &a);
      if(a == 10){
    sum += solve(&sf, a);
    sf += 2;
    scanf("%d", &a);
    sum += solve(&sf, a) - a;
    scanf("%d", &a);
    sum += a;
      }else{
    sum += solve(&sf, a);
    scanf("%d", &b);
    sum += solve(&sf, b);
    if(a + b == 10){
      scanf("%d", &b);
      sum += b;
    }
      }
      q.push(P(n, sum));
    }
    while(!q.empty()){
      P p = q.top(); q.pop();
      printf("%d %d\n", p.n, p.p);
    }
  }
  return 0;
}
````


構造体の比較演算子適当に書いたけど大丈夫だったようです。
他の人もelse ifとか大量に書いてる