Problem:
Problem E: カントリーロード

ある過疎地域での話である．
この地域ではカントリーロードと呼ばれるまっすぐな道に沿って，
家がまばらに建っている．
今までこの地域には電気が通っていなかったのだが，
今回政府からいくつかの発電機が与えられることになった．
発電機は好きなところに設置できるが，
家に電気が供給されるにはどれかの発電機に電線を介してつながっていなければならず，
電線には長さに比例するコストが発生する．
地域で唯一の技術系公務員であるあなたの仕事は，
すべての家に電気が供給されるという条件の下で，
できるだけ電線の長さの総計が短くなるような発電機
および電線の配置を求めることである．
なお，発電機の容量は十分に大きいので，
いくらでも多くの家に電気を供給することができるものとする．

サンプル入力の1番目のデータセットを図2に示す．
この問題に対する最適な配置を与えるには，
図のように x = 20 と x = 80 の位置に発電機を配置し，
それぞれ図中のグレーで示した位置に電線を引けばよい．

図2: 発電機と電線の配置の例（入力例の最初のデータセット）．

Input

入力の1行目にはデータセットの個数 t
(0 < t ≤ 50) が与えられる．

引き続き t 個のデータセットが与えられる．
データセットはそれぞれ次のような形式で2行で与えられる．

n k
x1 x2 ... xn

n は家の戸数，k は発電機の個数である．
x1, x2, ...,
xn
はそれぞれ家の位置を表す一次元座標である．
これらの値はすべて整数であり，
0 < n ≤ 100000,
0 < k ≤ 100000,
0 ≤ x1 < x2 <
... < xn ≤ 1000000
を満たす．

さらに，データセットのうち 90% は，
0 < n ≤ 100, 0 < k ≤ 100 を満たしている．

Output

各データセットに対し，
必要な電線の長さの総計の最小値を1行に出力せよ．

Sample Input

6
5 2
10 30 40 70 100
7 3
3 6 10 17 21 26 28
1 1
100
2 1
0 1000000
3 5
30 70 150
6 4
0 10 20 30 40 50

Output for the Sample Input

60
13
0
1000000
0
20

Solution in C++ (judge verdict: Time Limit Exceeded)

#include <iostream>

using namespace std;

int main(){
	int DataSetNum = 0;
	int HouseNum = 0;//家の数
	int GeneNum = 0;//発電機の数
	int* HousePos;//家の位置
	int* CableLength;//送電線長さ
	int CutNum = 0;//切断回数=発電所設置個数-1
	int CutPos = 0;//切断予定位置
	int CutLength = 0;//切断予定距離
	int AllCableLength = 0;//全線距離

	cin >> DataSetNum;//データセット数取得
	for (int datanum = 0; datanum < DataSetNum; ++datanum){
		//各データ入力
		cin >> HouseNum;
		cin >> GeneNum;
		if (HouseNum == 1){//家が一戸なら距離0は明らか
			int dummy = 0;//データ読み捨て
			for (int i = 0; i < HouseNum; ++i){
				cin >> dummy;
			}
			cout << 0 << endl;
			continue;
		}
		HousePos = new int[HouseNum];
		for (int i = 0; i < HouseNum; ++i){
			cin >> HousePos[i];
		}
		CableLength = new int[HouseNum - 1];
		for (int i = 0; i < HouseNum - 1; ++i){
			CableLength[i] = HousePos[i + 1] - HousePos[i];
		}
		//変数初期化
		CutNum = 0; CutPos = 0;
		while (1){
			//発電所数OKor切断不能->終了処理
			if ((CutNum + 1) == GeneNum || CutPos == -1){
				AllCableLength = 0;//全線距離
				for (int i = 0; i < HouseNum - 1; ++i){
					AllCableLength += CableLength[i];
				}
				cout << AllCableLength << endl;
				break;
			}
			//変数初期化
			CutPos = -1; CutLength = 0;
			//送電線走査＆切れるとこで1回切る
			for (int i = 0; i < HouseNum - 1; ++i){//送電線走査
				if (CableLength[i] > CutLength){//最長距離走査
					CutLength = CableLength[i];
					CutPos = i;
				}
			}
			if (CutPos != -1){//切断処理
				CableLength[CutPos] = 0;
				++CutNum;
			}
		}

		delete[] CableLength;
		delete[] HousePos;
	}

	return 0;
}