AT-02. AtCoderBeginnerContest431

A – Robot Balance

https://atcoder.jp/contests/abc431/tasks/abc431_a

頭パーツと体パーツの重さが与えられ、 頭パーツの方が重いとロボットが倒れてしまうので体パーツが倒れないようにするために、体パーツを後何グラム重くする必要があるかを求める問題でした。

これは、
(1)体パーツが頭パーツの重さ以上の場合はこれ以上、体パーツを重くする必要はないため、0を出力する。
(2)頭パーツが体パーツよりも重い場合は頭パーツと体パーツの差を求め、その差を体パーツに足せば、体パーツと頭パーツの重さが等しくなり、ロボットが倒れなくなるため、頭パーツと体パーツの差を出力する。

これをC++で実装した。

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

int main(){
   int H, B;
   cin >> H >> B;
   if(H <= B){
        cout << 0 << endl;
        return 0;
   }else{
        cout << H - B << endl;
   }
}
Code language: C++ (cpp)

B – Robot Weight

https://atcoder.jp/contests/abc431/tasks/abc431_b

あるロボットに対し、
(1)ロボットに種類Piの部品がついていなければ付ける。
(2)ロボットに種類Piの部品がついていれば取り外す。
という操作を行い、各クエリが終了したときのロボットの重さを出力する問題であった。B問題なのにクエリが出てきてびっくりしたが、理解すれば簡単に解くことができる問題であった。

これはつまり、ロボットに部品がついてるかどうかを管理する配列を追加して、ロボットについているならtrue、ついていないならfalseで管理し、trueの時にはその重さを引き、falseの時にはその重さを足せばよい。部品の重さの配列Wは、種類iの部品の重さをwiとすると、
W={w1, w2, … , wi, … , wN}で表されるので、それに対応した、ロボットに部品がついているかどうかの配列appを作成し、種類iの部品がロボットについているかどうかの真偽値をappiとすると、
app={app1, app2, … , appi, … , appN}で表される。

コードは以下のように作成した。

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

int main(){
   int x, n, q, p;
   cin >> x >> n;
   vector<int> w(n+1);
   vector<bool> app(n+1, false);
   for(int i = 1; i <= n; i++){
        cin >> w[i];
   }
   cin >> q;
   while(q){
        cin >> p;
        if(app[p]){
            x -= w[p];
            app[p] = false;
        }else{
            x += w[p];
            app[p] = true;
        }
        cout << x << endl;
        q--;
   }
}
Code language: C++ (cpp)