レベル
灰色コーダーの私が私の復習用兼Qiitaの発信練習用に執筆しているので、過不足が激しいです。始めて投稿する記事ですし、この記事を見るのはおすすめしません。
もし億が一この記事を見て間違いなど発見されましたらコメントお願いします。
AtCoderBegginerContest310
のA問題解説します(誰得?)
入力部分
問題文読むと眠くなったり集中力切れたりやる気なくなったりするのでまずは手を動かします。
そのために「入力は以下の形式で・・・」ってところを見ます。
N P Q
D1 D2 ... DN
入力はすべて整数っていうのが見えたので、c++のintを使って宣言していきます。
int N,P,Q;
それぞれに入力します。
cin >> N >> P >> Q;
D1~DNは、整数が何個入るかわからないので、vectorを使って動的配列を作ります。
vector<int> D(N);
pythonでいうところのlistと同じだと思います。
c++のarrayで配列を宣言する場合は、静的配列といって格納できる数が予め決まってます。vectorはそのサイズを増やしたり減らしたりできるので動的配列っていうみたいですね。
次にDっていう配列?(配列って呼んでいいのかわからない)にN個の数字を入力するプログラムを書きます。
for(int i = 0; i < N; i++){
cin >> D[i];
}
N回forループをするので、計算量はオーダーN?な気がする。
入力のプログラムがあってるかたしかめる
初心者だと入力部分の実装で手一杯みたいなことありません?なければこの章は飛ばしてもらって大丈夫です。
cout << N << P << Q;
for(int i = 0; i < N; i++){
cout << D[i];
}
cout << endl;
入力の逆をやって、入力したやつと同じのが出るかどーか確認します。同じのが出たら上記のプログラムは消します。
問題の方針を立てる
頑張って文章読みます。ABCのコンテストは毎週土曜の21時から開催されるので、ご飯食べた後で眠たいですがコーヒーでも飲んで頑張りましょう。
頑張って読んだ結果私たちがやるべきことは
「P円とQ+Di円の小さい方を出力する」です。
さらに、Q+Di円の価格はiの数値によって変わってくるので、Q+Di円の最小値を先に求めておきたいです。
Q+Di円の最小値を求める
//最小値minDを大きめに設定しとく
int minD = 9999999;
for(int i = 0; i < N; i++){
if(minD > D[i]){
minD = D[i];
}
}
minDとD[1],D[2],D[3]....D[N]を比べて、小さいやつをminDに入れておくことで最小値が求まります。
入力文もforループ使ってここでもforループ使うと冗長なので、合体させます。
int minD = 9999999;
for(int i = 0; i < N; i++){
cin >> D[i];
if(minD > D[i]){
minD = D[i];
}
}
あとは、「P円とQ+Di円の小さい方を出力する」だけです。
P円Q+Di円の小さい方を出力する
int Pien = Q + minD;
if(P > Pien){
cout << Pien << endl;
}else{
cout << P << endl;
}
全体プログラム
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,P,Q;
cin >> N >> P >> Q;
vector<int> D(N);
int minD = 999999;
for(int i = 0; i < N; i++){
cin >> D[i];
if(minD > D[i]){
minD = D[i];
}
}
int Pien = Q + minD;
if(P > Pien){
cout << Pien << endl;
}else{
cout << P << endl;
}
return 0;
}
感想
始めてQiitaで記事を書いてみました。HTMLタグを書かずにめちゃくちゃ簡単に書けるので、Qiita楽しいです。
発信することは課題発見にも繋がりますし、アウトプットによって記憶の定着にもなりますのでなんとなく良いことな気がします。
今後も数週間から数カ月は誰得?な記事を発信して自身の成長に繋げて行こうと思います。もし億が一この記事を見てくださっている誰かがいたのなら、私が誰かの役に立てる記事がかけるようになるまで見守っていてください。