見出し画像

コレクティングボール(簡単な方)の問題を解いた

問題が一見するとめちゃややこしくみえたけど、実際問われていることはシンプルだった。とりあえず用紙に手書きで書いたりして、まずまとめました。

問題書くのもかなり手間なので、問題の内容はサイトを参照です。

入力するもの

整数の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;
}



この記事が気に入ったらサポートをしてみませんか?