ABC055 ARC069 の問題を解いてみました


## A問題
https://atcoder.jp/contests/abc055/tasks/abc055_a

もらえる金額を考えずに、まずは払う金額を掛け算で先に計算します。
その後、貰える金額も計算することによって、この問題は解くことができます。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n;
  cin >> n;
  int ans = n * 800; //払う金額を計算
  ans -= n / 15 * 200; //貰う金額を計算
  cout << ans << endl;
}
~~~

## B問題
https://atcoder.jp/contests/abc055/tasks/abc055_b

この問題は $N!$ を計算するという問題です。
繰り返しで計算しましょう。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n;
  cin >> n;
  long long ans = 1;
  for(int i = 1; i <= n; i++){ //階乗を計算する
    ans *= i;
    ans %= 1000000007;
  }
  cout << ans << endl;
}
~~~

## C問題
https://atcoder.jp/contests/abc055/tasks/arc069_a

<code>S</code> は、<code>Scc</code> を作るためにしか使えないので、<code>Scc</code> を優先的に作っていきます。
その後に、<code>c</code> が余ったなら、<code>c</code>4つ で <code>Scc</code> を作ります。

上の手順でできた <code>Scc</code> の数を出力すれば良いです。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  long long n,m;
  cin >> n >> m;
  long long ans = 0;
  
  ans += min(n, m / 2);
  //S,cのどちらかがなくなるまで、Scc をとりあえず作る
  n -= ans;   
  m -= ans * 2;
  //上の手順で使った S,c の数を減らす
  
  ans += m / 4;
  //余った c で Scc を作る
  
  cout << ans << endl;
}
~~~


## D問題
https://atcoder.jp/contests/abc055/tasks/arc069_b

$i - 2$ 番目と、 $i - 1$ 番目の動物の種類がわかっていれば、$i$ 番目の動物の種類が特定できます。

* $i-1$ 番目の動物が羊で、その羊が <code>o</code> と答えたなら $i$番目の動物は、$i-2$番目の動物と同じ種類になります。
* $i-1$ 番目の動物が羊で、その羊が <code>x</code> と答えたなら $i$番目の動物は、$i-2$番目の動物と違う種類になります。
* $i-1$ 番目の動物が狼で、その狼が <code>o</code> と答えたなら $i$番目の動物は、$i-2$番目の動物と違う種類になります。
* $i-1$ 番目の動物が狼で、その狼が <code>x</code> と答えたなら $i$番目の動物は、$i-2$番目の動物と同じ種類になります。

つまりは、連続した二つの動物の種類さえわかっていれば、他の動物の種類もわかるということです。

連続した二つの動物の種類の 羊と羊, 羊と狼, 狼と羊, 狼と狼 という組み合わせを試して、矛盾が発生するかを調べます。
もし、矛盾が発生しない方法があるならば、その方法を出力して、
そうでなければ -1 を出力します。



~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
string a[4] = {"SS", "SW", "WS", "WW"};
//隣り合う動物の並びすべて

int main(void){
  int n;
  string s, t;
  cin >> n >> s;
  
  for(int i = 0; i < 4; i++){ // 4通り試す
    t = a[i]; //動物の組み合わせ
    
    for(int j = 2; j < s.size(); j++){ //動物の種類を決めていく
      if(t[j-1] == 'S'){ //j番の動物が羊なら
        if(s[j-1] == 'o'){ //j番の動物の両端が同じなら
          t += t[j-2];
          // j-1 番の動物 == j+1 番の動物
        }
        else{ //j番の動物の両端が違うなら
          if(t[j-2] == 'S') t += "W";
          else t += "S";
          // j-1 番の動物 != j+1番の動物
        }
      }
      else{ //j番の動物が狼なら
        if(s[j-1] == 'x'){ //j番の動物の両端が同じなら
          t += t[j-2];
        }
        else{ //j番の動物の両端が違うなら
          if(t[j-2] == 'S') t += "W";
          else t += "S";
          //j-1 番の動物 != j+1番の動物
        }
      }
    }
    //矛盾が生じていないのか確かめる
    bool ok = true;
    if(t[n-1] == 'S'){ //最後の動物が羊なら
      if(s[n-1] == 'o'){ //最後の動物の両端が同じなら
        if(t[n-2] != t[0]) ok = false;
        //矛盾が生じているなら
      }
      else{ //最後の動物の両端が違うなら
        if(t[n-2] == t[0]) ok = false;
        //矛盾が生じているなら
      }
    }
    else{ //最後の動物が狼なら
      if(s[n-1] == 'x'){ //最後の動物の両端が同じなら
        if(t[n-2] != t[0]) ok = false;
        //矛盾が生じているなら
      }
      else{ //最後の動物の両端が違うなら
        if(t[n-2] == t[0]) ok = false;
        //矛盾が生じているなら
      }
    }
    if(t[0] == 'S'){ //最初の動物が羊なら
      if(s[0] == 'o'){ //最初の動物の両端が同じなら
        if(t[n-1] != t[1]) ok = false;
        //矛盾が生じているなら
      }
      else{ //最初の動物の両端が違うなら
        if(t[n-1] == t[1]) ok = false;
        //矛盾が生じているなら
      }
    }
    else{ //最初の動物が狼なら
      if(s[0] == 'x'){ //最初の動物の両端が同じなら
        if(t[n-1] != t[1]) ok = false;
        //矛盾が生じているなら
      }
      else{ //最後の動物の両端が違うなら
        if(t[n-1] == t[1]) ok = false;
        //矛盾が生じているなら
      }
    }
    
    if(ok){ //矛盾が生じていないなら
      cout << t << endl;
      return 0;
    }
  }
  cout << -1 << endl;
}
~~~