[AtCoder]ABC 141A – Weather Prediction ~ 146[C++]

プログラミング

AtCoderのA問題の過去問をC++で解いていきます。ABC 141A – Weather Predictionから解いていきます。

ABC 141A – Weather Prediction

問題

高橋君の住む町の天気は、一日ごとに晴れ(Sunny)、くもり(Cloudy)、雨(Rainy)、晴れ、くもり、雨、… と周期的に変化します。
今日の天気を表す文字列Sが与えられるので、明日の天気を予測してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;

  if(S == "Sunny"){
    cout << "Cloudy" << endl;
  }else if(S == "Cloudy"){
    cout << "Rainy" << endl;
  }else {
    cout << "Sunny" << endl;
  }
}

ゴリ押しです。

ABC 142A – Odds of Oddness

問題

整数Nが与えられます。
高橋君は、N以下の正整数の中から等確率で1つを選んでaとします。
このとき、aが奇数である確率を答えてください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int N;
  cin >> N;
 
  if(N % 2 == 0){
    cout << 0.5 << endl;
  }else {
    cout << (N / 2 + 1) / (float)N << endl;
  }
}

Nが偶数の時は、Nまでの数字の半分が奇数なのは確定なので、確率は0.5になります。Nが奇数の時は、半分に一つ足した数が奇数になるので、(N / 2 + 1)としています。その値をNで割れば答えとなります。float型に変換していることに注意しましょう。
(int)Nとすると、int型に変換できます。
余りを計算する剰余(%)ってint型にしか使えないんですね。今知りました。当然と言えば当然か。

ABC 143A – Curtain

問題

高橋君の家の窓の横方向の長さはAであり、横方向の長さがBのカーテンが2枚取り付けられています。(カーテンは縦方向には窓を覆うのに十分な長さがあります。)
窓のうちカーテンで隠されていない部分の横方向の長さが最小になるようにカーテンを閉めます。 このとき、窓のカーテンで隠されていない部分の合計の横方向の長さを求めてください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int A, B;
  cin >> A >> B;
  
  int ans = A - B * 2;

  if(ans > 0){
    cout << ans << endl;
  }else {
    cout << 0 << endl;
  }
}

Bを二倍して、それをAから引けば答えですね。その答えが、マイナスなら、0を出力します。

ABC 144A – 9×9

問題

高橋君は九九を覚えたので、1以上9以下の2つの整数の積を計算することができます。それ以外の計算はできません。
2つの整数A,Bが与えられます。
高橋君がA×Bを計算できるならその結果を、できないなら代わりに -1 を出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int A, B;
  cin >> A >> B;

  if(A < 10  && B < 10 ){
    cout << A * B << endl;
  }else {
    cout << "-1" << endl;
  }
}

AとBがどちらも9以下であればA*Bを、そうでなければ、-1を出力すればいいですね。

ABC 145A – Circle

問題

整数rが与えられます。
半径rの円の面積が半径1の円の面積の何倍になるかを求めてください。
なお答えは制約の下では必ず整数になることが示せます。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int r;
  cin >> r;

  cout << pow(r, 2) << endl;
}

rを二乗したものが答えとなります。pow関数を使えばいいですね。

ABC 146A – Can’t Wait for Holiday

問題

今日の曜日を表す文字列Sが与えられます。
Sは SUN,MON,TUE,WED,THU,FRI,SAT のいずれかであり、それぞれ日曜日、月曜日、火曜日、水曜日、木曜日、金曜日、土曜日を表します。
次の日曜日 (あす以降) が何日後か求めてください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string S;
  cin >> S;

  if(S == "SUN"){
    cout << 7 << endl;
  }else if(S == "MON"){
    cout << 6 << endl;
  }else if(S == "TUE"){
    cout << 5 << endl;
  }else if(S == "WED"){
    cout << 4 << endl;
  }else if(S == "THU"){
    cout << 3 << endl;
  }else if(S == "FRI"){
    cout << 2 << endl;
  }else{
    cout << 1 << endl;
  }
}

ゴリ押しです。

もっとよくする

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string S;
  cin >> S;

  string weeks[] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};

  for(int i = 0; i < 7; i++){
    if(weeks[i] == S){
      cout << 7 - i << endl;
    }
  }
}

他の人の参考にコードを変えました。forを使うと、コードが短くなっていいですね。byte数も421byte=>258byte

タイトルとURLをコピーしました