ねむーの日記~AtCoderな日々~

福岡に住むプログラミング好きのブログです!

AtCoder Beginner Contest 129 B - Balance

最近冷やしうどん中心の食生活です、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc129)にて開催されました、AtCoder Beginner Contest 129 B問題「B - Balance」の問題と僕との戦闘記です。

0.はじめに

今回も、プログラミング言語C#を使用しています。

1.問題文

1 から N の番号がついた N 個の重りがあり、番号 i の重りの重さは W i です。

ある整数 1 ≤ T < N に対してこれらの重りを、番号が T 以下の重り と 番号が T より大きい重りの 2 グループに分けることを考え、それぞれのグループの重さの和を S 1 , S 2 とします。

このような分け方全てを考えた時、 S 1 と S 2 の差の絶対値の最小値を求めてください。

2.制約

  • 2 ≤ N ≤ 100
  • 1 ≤ W i ≤ 100
  • 入力は全て整数である

3.入力例

  • 入力
8
27 23 76 2 3 5 62 52
  • 出力
2

4.初見の感想

  • できれば二重ループは回したくない

5.学びポイント

  • 数字列を2つに分ける

→数列の先頭を左側に分類or数列の末尾を右側に分類

→上の操作をN回繰り返せばよい

  • 判定条件は左側と右側のどちらが大きいか

6.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        int N = int.Parse(Console.ReadLine());
        string[] input = Console.ReadLine().Split(' ');
        int[] W = new int[N];
        for(int i = 0; i < N; i++)
        {
            W[i] = int.Parse(input[i]);
        }
        int left = 0;
        int right = 0;
        int l = 0;
        int r = N - 1;
        for (int i = 0; i < N; i++)
        {
            if (left <= right) { left += W[l];l++; }
            else { right += W[r]; r--; }
        }
        Console.WriteLine(Math.Abs(left-right));
    }
}

7.最後に

12分ほどで解けたので満足です!