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

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

AtCoder Beginner Contest 156 C - Rally

実家で生活習慣の改善をしています、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc156/tasks/abc156_c)にて開催されました、AtCoder Beginner Contest 156 C問題「C - Rally」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

数直線上に N 人の人が住んでいます。

i 番目の人が住んでいるのは座標 X i です。

あなたは N 人全員が参加する集会を開くことを考えています。

集会は数直線上の任意の 整数値の座標 で開くことができ、座標 P で集会を開くとき、 i 番目の人は集会に参加するために ( X i − P ) 2 の体力を消費します。

N 人が消費する体力の総和としてありえる値の最小値を求めてください。

2.制約

  • 入力は全て整数である。
  • 1 ≤ N ≤ 100
  • 1 ≤ X_i ≤ 100

3.入出力例

  • 入力
7
14 14 2 13 56 2 37
  • 出力
2354

4.初見の感想

  • どのように数直線上に人間が分布しているかで大きく結果が変わる
  • 1~100までしか範囲が無いので各点での結果を全探索します

5.コードと簡単な解説

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int N=int.Parse(Console.ReadLine());
            string[] input=Console.ReadLine().Split();
            int []X=new int[N];
            for(int i=0;i<N;i++){
                X[i]=int.Parse(input[i]);
            }
            int ans=int.MaxValue;
            for(int i=0;i<100;i++){
//各点iでのループ
                int temp=0;
                for(int j=0;j<N;j++){
//距離の2乗を計算
                    temp+=(X[j]-i)*(X[j]-i);
                }
                ans=Math.Min(ans,temp);
            }
            Console.WriteLine(ans);
        }
    }
}

6.最後に

この問題が灰パフォは驚き!