A問題
文字列の1文字目の文字コードから 32 を引けば、小文字から大文字に変換することができます。
なので、この処理をそれぞれに行えば解くことができます。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
string s[3];
for(int i = 0; i < 3; i++){
cin >> s[i];
printf("%c", s[i][0] - 32);
//小文字から大文字に変換する
}
cout << "\n";
}
ASCII コードとは
ASCII コードの表はこちら。
B問題
数字として普通に受け取ってしまうと、C++ではオーバーフローしてしまいます。
なので、文字列として扱いましょう。
もし、$A, B$ の文字列の長さが異なるなら、その長さで判定して、そうでなければ、$A, B$ の大小で判定すれば良いです。
C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
string a, b;
cin >> a >> b;
//文字列の長さでの処理
if(a.size() > b.size()){
cout << "GREATER" << endl;
return 0;
}
else if(a.size() < b.size()){
cout << "LESS" << endl;
return 0;
}
//文字列の長さが同じだった場合への処理
if(a > b){
cout << "GREATER" << endl;
}
else if(a < b){
cout << "LESS" << endl;
}
else{
cout << "EQUAL" << endl;
}
}
また、Python を使用すると、オーバーフローについて考える必要がありません。
Python
a = int(input())
b = int(input())
if a > b:
print("GREATER")
elif a < b:
print("LESS")
else:
print("EQUAL")
C問題
- すべての$i(1≦i≦n)$ に対し、第 $1$ 項から第 $i$ 項までの和は $0$ でない
- すべての$i(1≦i≦n−1)$ に対し、$i$ 項までの和と $i+1$ 項までの和の符号が異なる
という条件を満たすために必要な最小の操作回数を求めます。
まず、2つの条件から、1つの項の正負を決めることによって、他の項の正負が定まることがわかります。
なので、1番目の項を正にする場合と、負にする場合の操作回数を求めて、少ない方を出力します。
$a_i$までの総和の正負が、目的の正負と異なるならば、
- 負になるべきなら 総和が -1 になるように $a_i$ を変更
- 正になるべきなら 総和が 1 になるように $a_i$ を変更
という処理を行えばよいです。
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
int main(void){
int n;
cin >> n;
vector<long long> a(n), ans(2);
ans[0] = 0, ans[1] = 0;
for(int i = 0; i < n; i++) cin >> a[i];
//入力を受け取る
for(int i = 0; i < 2; i++){ //1番目の項を負の数にするかせいのかにするかのループ
long long sum = 0;
for(int j = 0; j < n; j++){
sum += a[j];
if(j % 2 == i){ // j番目の項の目的が負の数なら
if(sum >= 0){ // j番目までの総和が正の数なら
ans[i] += abs(sum + 1);
//総和が -1 になるまで操作する
sum = -1;
}
}
else{ // j番目の項の目的が正の数なら
if(sum <= 0){ // j番目の項の目的が正の数なら
ans[i] += abs(sum - 1);
//総和が 1 になるまで操作する
sum = 1;
}
}
}
}
cout << min(ans[0], ans[1]) << endl;
}
D問題