A問題
安いベル2つを購入すれば良いです。
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.
signed main(void){
vector<int> bell(3);
for(int i = 0; i < 3; i++) cin >> bell[i];
sort(bell.begin(), bell.end());
cout << bell[0] + bell[1] << endl;
}
別解
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.
signed main(void){
int a, b, c;
cin >> a >> b >> c;
cout << (a + b + c) - max({a, b, c}) << endl;
//合計から最も高いベルの価格を引く
}
B問題
pop_back()で末尾の文字を消して、判定することを繰り返しましょう。
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.
signed main(void){
int n;
string s;
cin >> s;
n = s.length(); //sの長さを保存しておく
for(int i = 1; i <= n; i++){
s.pop_back();
int m = n - i; //今の文字列の長さ
if(m % 2 == 1) continue; //長さが奇数の場合は、偶文字列ではない
if(s.substr(0, m / 2) == s.substr(m / 2, m / 2)){ //判定
cout << m << endl;
return 0;
}
}
}
C問題
毎回$b$を並び替えていると時間がかかってしまうので、$b$が反転しているかを記録しておいて、もし反転しているなら後ろから出力するという処理をできるようにしたいです。
しかし、それでは1の処理のときにおかしくなってしまいます。
そこで1の処理にどのように対応するか考えます。
すると、$b$が反転しているとき、末尾に加えるという操作は、先頭に加えるという操作で対応できることがわかります。
それを実装しましょう。
#include <bits/stdc++.h>
using namespace std; using ll = long long;
//Created by karaju.
signed main(void){
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; i++) cin >> a[i];
deque<int> b;
bool rev = false; //反転しているか記録するbool型
for(int i = 0; i < n; i++){
if(!rev){ //反転していない
b.push_back(a[i]);
}
else{ //反転している
b.push_front(a[i]);
}
rev = !rev; //反転させる
}
if(!rev){
for(int i = 0; i < n; i++){
cout << b[i] << " ";
}
}
else{
for(int i = n - 1; i >= 0; i--){
cout << b[i] << " ";
}
}
}
D問題