A問題
$a$ と $b$ と $c$ が同じペンキなら 1 を
$a , b , c$ の 2つが同じペンキなら 2 を
3つの色がすべて異なるなら 3 を 出力します。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
int a, b, c;
cin >> a >> b >> c;
if(a == b && b == c) cout << 1 << endl;
else if(a == b || b == c || c == a) cout << 2 << endl;
else cout << 3 << endl;
}
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
set<int> paint;
for(int i = 0; i < 3; i++){
int a;
cin >> a;
paint.insert(a);
}
cout << paint.size() << endl;
}
B問題
一番左のボールは $K$ 通り、 それ以外は左のボールの色を除いて、 $K - 1$ 通りの塗り方があります。
合計で何通りかを繰り返しで計算しましょう。(オーバーフローに注意)
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
int n, k;
cin >> n >> k;
long long ans = k;
for(int i = 1; i < n; i++){
ans *= k - 1;
}
cout << ans << endl;
}
C問題
全探索では、 この提出 のように、TLEになってしまいます。
なので、全探索ではない解き方を考える必要があります。
高橋くんの得票数を$A$ , 青木くんの得票数を$B$ とします。
また、$A \leq n \times T_i$ かつ、 $B \leq n \times A_i$ を満たす 最小の$n$ を求めれば、
最小の得票数は、 $n \times T_i$ と $n \times A_i$ で表せます。
その$n$は $max(\lceil A \div T_i \rceil, \lceil B \div A_i \rceil)$ で求められます。
この処理を繰り返せば、この問題は解くことができます。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
int n;
cin >> n;
long long t_now = 1, a_now = 1, t, a;
// t_now, a_now は 両者の得票数
for(int i = 0; i < n; i++){
cin >> t >> a;
long long mag = max( (t_now + t - 1) / t, (a_now + a - 1) / a );
// a / b の切り上げは、 (a + b - 1) / b で 計算できる
t_now = t * mag;
a_now = a * mag;
}
cout << a_now + t_now << endl;
}
D問題
問題を読んで考えてみると、できるだけパーの回数が多いほうが良いということがわかります。そして、勝つ方法は、 相手がグーを出したときに自分がパーを出す という方法のみです。
なので、相手がパーを出したらパーで対応して、相手がグーを出したらできるだけパーで対応するというのが最善手です。
このことから、答えは $自分が出せるパーの回数 - 相手のパーの回数$ で求められます。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
string s;
cin >> s;
int g = 0, p = 0;
//グー・パーの数をカウントする変数
for(int i = 0; i < s.size(); i++){
if(s[i] == 'g') g++;
else p++; //パーの回数を数える
}
int times = s.size() / 2;
//自分の出せるパーの回数を求める
cout << times - p << endl;
}