AOJ2104 Country Road

問題リンク Country Road

  • 解法

発電機を置く座標を考える必要は全くありません。その発電機によって電力が供給される家の範囲を考えます。1台のとき、1〜Nの家全てをカバーするので電線の長さはx_N-x_1です。発電機がもう1台あったとき、x_1 〜 x_k と x_k+1 〜 x_Nの範囲をそれぞれカバーすることになります。これによって削減できる電線の長さはx_k+1 - x_kとなるので、隣接距離が最も大きいkとk+1を選べば良いことが分かります。つまり、隣接距離を降順でソートして、発電機の台数がある限り、引いていけば電線の長さが最小になります。

  • ソース
import java.util.Arrays;
import java.util.Scanner;

//Country Road
public class AOJ2104 {

	void run(){
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		while(T--!=0){
			int n = sc.nextInt(), k = sc.nextInt();
			int[] a = new int[n], len = new int[n-1];
			for(int i=0;i<n;i++)a[i] = sc.nextInt();
			for(int i=0;i<n-1;i++)len[i]=a[i+1]-a[i];
			Arrays.sort(len);
			int res = a[n-1]-a[0];
			int j = n-2;
			while(j>=0&&--k!=0)res-=len[j--];
			System.out.println(res);
		}
	}
	
	public static void main(String[] args) {
		new AOJ2104().run();
	}
}