Problem:
鉄道路線II

わたしの住む街には、図のような N 個の駅からなる円環状の鉄道路線があります。この路線の各駅には 0 から N-1 までの番号が順番に割り当てられていて、隣の駅まで100 円で移動することができます。移動はどちらの方向にでも可能です。

わたしはこの路線上のいくつかの駅で買い物をしたいと思っています。そこで、プログラムを作成して移動費を計算することにしました。ある駅を始点として、買い物をするすべての駅を訪問する最小の費用（円）を求めるプログラムを作成してください。ただし、同じ駅を何度訪問しても良く、どのような順番で駅を訪問しても構いません。

入力

入力は以下の形式で与えられる。

N M p
d1
d2
:
dM

1行目に駅の数 N (2 ≤ N ≤ 100000)、買い物をする駅の数 M (1 ≤ M ≤ 10000 かつ M < N)、出発する駅の番号 p (0 ≤ p ≤ N-1) が与えられる。続く M 行に買い物をする駅の番号 di (0 ≤ di ≤ N-1) が与えられる。ただし、diは全て異なり、p もまたどの di とも異なるものとする。

出力

最小の費用を１行に出力する。

入出力例

入力例１

5 4 0
1
2
3
4

出力例１

400

入力例２

7 2 1
6
2

出力例２

400

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

#include<iostream>
#include<cmath>
using namespace std;

/*int calc(int* stations, int n, int startPoint, int count){
	int currentIndex = startPoint;
	int totalDistance = 0;
	for(int i = 0; i < count; i++){
		int forwardDist = 0, backDist = 0;
		for(int j = 1; j < n; j++){
			if(stations[(startPoint + j) % n] == 1){
				forwardDist = j;
				break;
			}
		}
		
		for(int j = 1; j < n; j++){
			if(j > startPoint){
				if(stations[n - j + startPoint] == 1){
					backDist = j;
					break;
				}
			}else{
				if(stations[startPoint - j] == 1){
					backDist = j;
					break;
				}
			}
		}
	if(forwardDist < backDist){
		stations[(startPoint + forwardDist) % n] = 0;
		totalDistance += forwardDist;
		startPoint = (startPoint + forwardDist) % n;
	}else if(forwardDist > backDist){
		if(backDist < startPoint){
			stations[startPoint - backDist] = 0;
			startPoint = startPoint - backDist;
		}else{
			stations[n - backDist + startPoint] = 0;
			startPoint = n - backDist + startPoint;
		}
		totalDistance += backDist;
	}else{
		int fTotalDistance = totalDistance, bTotalDistance = totalDistance;
		int fStations[n];
		int tempStartPoint = startPoint;
		for(int k = 0; k < n; k++){
			fStations[k] = stations[k];
		}
		fStations[(startPoint + forwardDist) % n] = 0;
		fTotalDistance += forwardDist;
		startPoint = (tempStartPoint + forwardDist) % n;
		fTotalDistance += calc(fStations, n, startPoint, count - (i + 1));
		
		if(backDist < tempStartPoint){
			stations[tempStartPoint - backDist] = 0;
			startPoint = tempStartPoint - backDist;
		}else{
			stations[n - backDist + tempStartPoint] = 0;
			startPoint = n - backDist + tempStartPoint;
		}
		bTotalDistance += backDist;
		bTotalDistance += calc(stations, n, startPoint, count - (i + 1));
		
		if(fTotalDistance > bTotalDistance){
			totalDistance += bTotalDistance;
		}else{
			totalDistance += fTotalDistance;
		}
		break;
	}
	}
	return totalDistance;
}*/
int shortestDistance = -1;

void calc(int* stations, int n, int startPoint, int count, int currentDist){
	if(count == 0){
		if(shortestDistance < 0){
			shortestDistance = currentDist;
		}else{
			shortestDistance = shortestDistance < currentDist ? shortestDistance : currentDist;
		}
	}
	//????????¢?´¢
	for(int i = 0; i < n; i++){
		int index = (startPoint + i) % n;
		if(stations[index] == 1){
			stations[index] = 0;
			currentDist += i;
			calc(stations, n, index, count - 1, currentDist);
			currentDist -= i;
			stations[index] = 1;
		}
	}
	//????????¢?´¢
	for(int i = 0; i < n; i++){
		int index = 0;
		if(i <= startPoint){
			index = startPoint - i;
		}else{
			index = n - i + startPoint;
		}
		if(stations[index] == 1){
			stations[index] = 0;
			currentDist += i;
			calc(stations, n, index, count - 1, currentDist);
			currentDist -= i;
			stations[index] = 1;
		}
	}
}

int main(){
	int n, m, p;
	cin >> n >> m >> p;
	int stations[n];
	for(int i = 0; i < n; i++){
		stations[i] = 0;
	}
	for(int i = 0; i < m; i++){
		int d = 0;
		cin >> d;
		stations[d] = 1;
	}
	calc(stations, n, p, m, 0);
	cout << shortestDistance * 100 << endl;
	return 0;
}