[BaekJoon/Java]BaekJoon 2212センサー
問題の概要
センサがx座標軸上の任意の点に位置する場合、各センサを管理するためにk個の集中局を設定する必要がある.この時、各集の中国は管理範囲の協議の最高価格を求めなければならない.問題の説明は少し難しいが、すべてのセットの中国が管理しなければならない範囲ではない.
アイデア
k個セット中国を設定すると,k個センサが集まる集合が容易に生成される.すなわち,センサをk個の集合に分割し,各集合が座標上に占める長さ(集合のうち最も右のセンサ−集合のうち最も左のセンサ)の和を求める.絵の説明は以下の通りです.
6つのセンサがあり、2つの集中管理が必要です.
センサの位置が赤色の円である場合、センサ間の間隔は緑色の数字と見なすことができる.サンプル入力では2つのコレクタであるため、これらのセンサを2つのコレクタに分け、各コレクタ長の和がコレクタ受信可能領域の最大値である.画像中のセンサを2つのグループに分けるために,最大の間隔を除いて2つのグループに分けることができる.そうであれば、除去3〜>6のセンサ間のギャップが最大となる.
では,センサは(1,3)+(6,6,7,9)の2つのグループに分けられる.各束の長さ
(3-1)+(9-6)、これは5です.
すなわち,実装する必要がある集中点がk個であれば,各センサ間のギャップをアレイに格納してソートし,順次アレイからk−1個を削除し,残りのギャップを加算することで答えを得ることができる.
=>ギャップアレイ(0、1、2、2、3)から最大ギャップ3を削除し、残りのギャップを加算します.
(0+1+2+2)=5に等しい.
に答える
入力
コード#コード#
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int K = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] pos = new int[N];
for(int i = 0; i < N; i++) {
pos[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(pos);
int[] gap = new int[N-1];
for(int i = 0; i < N-1; i++) {
gap[i] = pos[i+1] - pos[i];
}
Arrays.sort(gap);
int sum = 0;
for (int i = N-2-(K-1); i >= 0; i--) {
sum += gap[i];
}
System.out.print(sum);
}
}
Reference
この問題について([BaekJoon/Java]BaekJoon 2212センサー), 我々は、より多くの情報をここで見つけました https://velog.io/@1876070677/BaekJoonJava-백준-2212-센서テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol