コレクティングボール(簡単な方)の問題を解いた
問題が一見するとめちゃややこしくみえたけど、実際問われていることはシンプルだった。とりあえず用紙に手書きで書いたりして、まずまとめました。
問題書くのもかなり手間なので、問題の内容はサイトを参照です。
入力するもの
整数のN、K、x。
Nはボールの個数。
Kは、ロボットBのx座標。
xはボールのx座標。
操作ボールが置かれているx座標までロボットAが取りに行って往復する距離と、ロボットBが取りに行って往復する距離を比べて、距離が近い方を採用して、最後に合計距離を出力するという問題。
ロボットAのx座標は、常に0のところにいて、
ロボットBのx座標はKなので任意の入力値。
入力は、N、K、xを下記のように入力する。
5
20
11 12 9 17 12
すると、出力は
74
と出力される。
ロボットBのいるx座標が2、ボールが置かれているx座標が5とかなど、2ー5=ー3みたいに負の数になる場合は、その数字にー1をかけて正の数に変換しました。
あと、この問題でもポイントとなるのが、for分のループで最小値を選びつつ、前回のループの合計を持ち越して足していくことが必要なので、合計をsum=0で初期化しておき、ifでの条件分岐でsum+=A、sum+=Bを足していくことだと思いました。前の問題でも同じことしたのに、少し苦戦しました。
あと、変数のスコープにも少し注意が必要ですね。コードテストでスコープ外のエラーを何度か出しました。
提出した解答がこちらで、なんとか1発で正解になりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int N,K,x;
int sum = 0;
cin >> N >> K;
for(int i = 0; i < N; i++){
cin >> x;
int A = 2*x;
int B = (x-K)*2;
if(B < 0){
B=-1*B;
}
if(A - B > 0){
sum += B;
} else {
sum += A;
}
}
cout << sum << endl;
}
この記事が気に入ったらサポートをしてみませんか?