0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ABC059 ARC072 の問題を解いてみました

Last updated at Posted at 2024-01-15

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問題

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?