問題0
各桁の和を出力するコード
# include<iostream>
using namespace std;
int main(){
int a;
cin >> a;
int dig;
int sum;
while(a){
dig = a % 10;
sum += dig;
a = a/10;
}
cout << sum << endl;
}
問題1
# include<iostream>
using namespace std;
int digitsum(int n){
int sum=0;
while(n){
sum += n%10;
n /= 10;
}
return sum;
}
int main(){
int N,A,B;
cin >> N >> A >>B;
int ans =0;
for(int i=1;i<=N;++i){
int k = digitsum(i);
if(k<=B && A<=k) ans += i;
}
cout << ans << endl;
}
問題2
# include <iostream>
# include <algorithm>
using namespace std;
int main() {
int N;
int a[110]; // 最大 100 個ですが余裕をもたせます
cin >> N;
for (int i = 0; i < N; ++i) cin >> a[i];
sort(a, a + N, greater<int>()); // a[0:N] を大きい順にソート
int Alice = 0;
int Bob = 0;
for (int i = 0; i < N; ++i) {
if (i % 2 == 0) { // Alice のターン
Alice += a[i];
}
else { // Bob のターン
Bob += a[i];
}
}
cout << Alice - Bob << endl;
}
問題3
// バケット法による解
# include <iostream>
using namespace std;
int main() {
int N;
int d[110];
cin >> N;
for (int i = 0; i < N; ++i) cin >> d[i];
int num[110] = {0}; // バケット
for (int i = 0; i < N; ++i) {
num[d[i]]++; // d[i] が 1 個増える
}
int res = 0; // 答えを格納
for (int i = 1; i <= 100; ++i) { // 1 <= d[i] <= 100 なので 1 から 100 まで探索
if (num[i]) { // 0 より大きかったら
++res;
}
}
cout << res << endl;
}
問題4
# include <iostream>
using namespace std;
int main() {
int N, Y;
cin >> N >> Y;
int res10000 = -1, res5000 = -1, res1000 = -1;
for (int a = 0; a <= N; ++a) { // 10000円の枚数を 0 〜 N で調べる
for (int b = 0; b + a <= N; ++b) { // 5000円の枚数を 0 〜 N-a で調べる
int c = N - a - b; // 1000円の枚数は決まる
int total = 10000*a + 5000*b + 1000*c;
if (total == Y) { // 答えが見つかったら
res10000 = a;
res5000 = b;
res1000 = c;
}
}
}
// 答えを出力 (見つかっていなくても -1 -1 -1 になるので OK です)
cout << res10000 << " " << res5000 << " " << res1000 << endl;
}
問題5
# include <iostream>
# include <string>
# include <algorithm>
using namespace std;
string divide[4] = {"dream", "dreamer", "erase", "eraser"};
int main() {
string S;
cin >> S;
// 後ろから解くかわりにすべての文字列を「左右反転」する
reverse(S.begin(), S.end());
for (int i = 0; i < 4; ++i) reverse(divide[i].begin(), divide[i].end());
// 端から切っていく
bool can = true;
for (int i = 0; i < S.size();) {
bool can2 = false; // 4 個の文字列たちどれかで divide できるか
for (int j = 0; j < 4; ++j) {
string d = divide[j];
if (S.substr(i, d.size()) == d) { // d で divide できるか
can2 = true;
i += d.size(); // divide できたら i を進める
}
}
if (!can2) { // divide できなかったら
can = false;
break;
}
}
if (can) cout << "YES" << endl;
else cout << "NO" << endl;
}