AtCoder Beginner Contest 129 B - Balance
最近冷やしうどん中心の食生活です、ねむーです。
今回はAtCoder(https://atcoder.jp/contests/abc129)にて開催されました、AtCoder Beginner Contest 129 B問題「B - Balance」の問題と僕との戦闘記です。
0.はじめに
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分ほどで解けたので満足です!