chacoderのブログ

競技プログラミングそのほか

天下一プログラマーコンテスト2014予選A B.がぶりん!

がぶりん!をACしました。

特別なアルゴリズムがでてくるわけではない実装するだけの問題ですが,がぶりんを投げて帰ってくるところをどう処理するか,コンボのカウントをどう処理するか,など悩みながら実装しました。
余計なことを考えて無駄に複雑にしているところがあるかも知れませんが無事にACできてよかったです。

#include<bits/stdc++.h>
using namespace std;

int main(){
  string s;
  cin>>s;
  s=s+"-----";
  long long len=s.length();
  long long r[len+10]={};  //帰ってくる時間の管理用
  long long g=5;//がぶりん 最初の数=5
  long long dm=0;
  long long score=0;    
  int c[len+10]={};
  int flag=0;
  
  
  //キュー処理
  for(long long i=0;i<len;i++){    
    //コンボ処理
    if(i !=0 && c[i] !=0){
      c[i]=c[i-1]+c[i];
    }
    else if(i !=0 && c[i] == 0){
        c[i]=c[i-1];
    }
     
    //もどってきたがぶりんの処理
    if(r[i]>0){
      g+=r[i];
    }
    
    if(flag>0){
      flag--;
      continue;
    }
    
    //ノーマル投げ
    if(s.at(i)=='N'){
      if(g>=1){
        g--;
        r[i+7]++;
        dm=10+floor(c[i]/10);
        c[i+2]++;         
        score+=dm;  
        continue;
      }
      else{
        continue;
      }
    }
          
    //ため投げ
    if(s.at(i)=='C'){
      if(g>=3){
        g-=3;
        r[i+9]+=3;
        dm=50+floor(c[i]/10)*5;
        score+=dm;
        c[i+4]+=1;
        flag=2;
        continue;
      }
      else{
        continue;
      }
    }
  }
  cout<<score<<endl;
  
  return 0;
}