#include <bits/stdc++.h>
using namespace std;
int N;
int test( int st, vector< int > & weak, vector< int > & dist) {
// weak 의 st 번째 부터 N개의 weak한 지점을 막는데,
// dist 의 순서대로 사람들을 배치할 때 필요한 최소 회수
int p = 0 ;
// 이제 막아야 될 weak의 인덱스
for ( int i = 0 ; i < dist.size ( ) ; i++ ) {
int a = weak[ st+ p] ;
// i 번 애가 탐색을 시작할 위치
while ( p < N and weak[ st+ p] <= a+ dist[ i] ) p++ ;
// 탐색 범위 안에 있는 동안 p를 증가시킨다.
if ( p == N) return i+ 1 ;
// 만약 N개를 모두 탐색했으면, 지금까지 탐색했던 애들의 수를 반환
}
return 1000 ;
// 끝까지 못찾으면 1000을 반환
}
int solution( int n, vector< int > weak, vector< int > dist) {
N = weak.size ( ) ;
// N 은 우리가 막아야 될 약한 지점의 개수
for ( int i = 0 , _i = N; i < _i; i++ ) {
weak.push_back ( weak[ i] + n) ;
}
// 원주 상에 있으니까 배열을 2배로 늘려서 직선처럼 변형
// 이 아래 부터는 weak가 원(circle)인 것은 무시하고 직선처럼 취급
// 2배로 늘렸으니까 이 배열의 길이는 2N인것에 주의
sort( dist.begin ( ) , dist.end ( ) ) ;
// next_permutation을 쓰기 위한 전처리 작업
int result = 1000 ;
// 결과를 저장할 변수
for ( int i = 0 ; i < N; i++ ) {
// i 는 2배로 늘린 weak 배열에서 막기 시작할 인덱스
// 잘 생각해 보면, 길이가 2N인 직선(위에서 만든)에서 임의의 연속된 N개를 고르면
// 원래 원에서 겹치지 않는 애들로 구성됨을 알 수 있음
// 자세한건 설명 힘드니 본인이 생각
do {
result = min( result, test( i, weak, dist) ) ;
} while ( next_permutation( dist.begin ( ) , dist.end ( ) ) ) ;
// next_permutation 함수는 입력받은 배열을 재배열한 것들 중 사전순으로 다음 배열을 반환해줌.
// 만약 주어진 배열이 사전순으로 마지막 배열이었으면 0을 반환
}
if ( result == 1000 ) return - 1 ;
// 결과가 1000 이면 어떤 경우도 성공시키지 못함
else return result;
// 그 외에는 결과를 반환
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IE47CgppbnQgdGVzdChpbnQgc3QsIHZlY3RvcjxpbnQ+ICZ3ZWFrLCB2ZWN0b3I8aW50PiAmZGlzdCkgewogICAgLy8gd2VhayDsnZggc3Qg67KI7Ke4IOu2gO2EsCBO6rCc7J2YIHdlYWvtlZwg7KeA7KCQ7J2EIOunieuKlOuNsCwKICAgIC8vIGRpc3Qg7J2YIOyInOyEnOuMgOuhnCDsgqzrnozrk6TsnYQg67Cw7LmY7ZWgIOuVjCDtlYTsmpTtlZwg7LWc7IaMIO2ajOyImAogICAgCiAgICBpbnQgcCA9IDA7CiAgICAvLyDsnbTsoJwg66eJ7JWE7JW8IOuQoCB3ZWFr7J2YIOyduOuNseyKpAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXN0LnNpemUoKTsgaSsrKSB7CiAgICAgICAgaW50IGEgPSB3ZWFrW3N0K3BdOwogICAgICAgIC8vIGkg67KIIOyVoOqwgCDtg5Dsg4nsnYQg7Iuc7J6R7ZWgIOychOy5mAogICAgICAgIHdoaWxlKHAgPCBOIGFuZCB3ZWFrW3N0K3BdIDw9IGErZGlzdFtpXSkgcCsrOwogICAgICAgIC8vIO2DkOyDiSDrspTsnIQg7JWI7JeQIOyeiOuKlCDrj5nslYggcOulvCDspp3qsIDsi5ztgqjri6QuCiAgICAgICAgaWYgKHAgPT0gTikgcmV0dXJuIGkrMTsKICAgICAgICAvLyDrp4zslb0gTuqwnOulvCDrqqjrkZAg7YOQ7IOJ7ZaI7Jy866m0LCDsp4DquIjquYzsp4Ag7YOQ7IOJ7ZaI642YIOyVoOuTpOydmCDsiJjrpbwg67CY7ZmYCiAgICB9CiAgICAKICAgIHJldHVybiAxMDAwOwogICAgLy8g64Gd6rmM7KeAIOuqu+ywvuycvOuptCAxMDAw7J2EIOuwmO2ZmAp9CgppbnQgc29sdXRpb24oaW50IG4sIHZlY3RvcjxpbnQ+IHdlYWssIHZlY3RvcjxpbnQ+IGRpc3QpIHsKICAgIE4gPSB3ZWFrLnNpemUoKTsKICAgIC8vIE4g7J2AIOyasOumrOqwgCDrp4nslYTslbwg65CgIOyVve2VnCDsp4DsoJDsnZgg6rCc7IiYCiAgICAKICAgIGZvciAoaW50IGkgPSAwLCBfaSA9IE47IGkgPCBfaTsgaSsrKSB7CiAgICAgICAgd2Vhay5wdXNoX2JhY2sod2Vha1tpXStuKTsKICAgIH0KICAgIC8vIOybkOyjvCDsg4Hsl5Ag7J6I7Jy864uI6rmMIOuwsOyXtOydhCAy67Cw66GcIOuKmOugpOyEnCDsp4HshKDsspjrn7wg67OA7ZiVCiAgICAvLyDsnbQg7JWE656YIOu2gO2EsOuKlCB3ZWFr6rCAIOybkChjaXJjbGUp7J24IOqyg+ydgCDrrLTsi5ztlZjqs6Ag7KeB7ISg7LKY65+8IOy3qOq4iQogICAgLy8gMuuwsOuhnCDripjroLjsnLzri4jquYwg7J20IOuwsOyXtOydmCDquLjsnbTripQgMk7snbjqsoPsl5Ag7KO87J2YCiAgICAKICAgIHNvcnQoZGlzdC5iZWdpbigpLCBkaXN0LmVuZCgpKTsKICAgIC8vIG5leHRfcGVybXV0YXRpb27snYQg7JOw6riwIOychO2VnCDsoITsspjrpqwg7J6R7JeFCiAgICAKICAgIGludCByZXN1bHQgPSAxMDAwOwogICAgLy8g6rKw6rO866W8IOyggOyepe2VoCDrs4DsiJgKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAvLyBpIOuKlCAy67Cw66GcIOuKmOumsCB3ZWFrIOuwsOyXtOyXkOyEnCDrp4nquLAg7Iuc7J6R7ZWgIOyduOuNseyKpAogICAgICAgIC8vIOyemCDsg53qsIHtlbQg67O066m0LCDquLjsnbTqsIAgMk7snbgg7KeB7ISgKOychOyXkOyEnCDrp4zrk6Ap7JeQ7IScIOyehOydmOydmCDsl7Dsho3rkJwgTuqwnOulvCDqs6DrpbTrqbQKICAgICAgICAvLyDsm5Drnpgg7JuQ7JeQ7IScIOqyuey5mOyngCDslYrripQg7JWg65Ok66GcIOq1rOyEseuQqOydhCDslYwg7IiYIOyeiOydjAogICAgICAgIC8vIOyekOyEuO2VnOqxtCDshKTrqoUg7Z6Y65Oc64uIIOuzuOyduOydtCDsg53qsIEKICAgICAgICAKICAgICAgICBkbyB7CiAgICAgICAgICAgIHJlc3VsdCA9IG1pbihyZXN1bHQsIHRlc3QoaSwgd2VhaywgZGlzdCkpOwogICAgICAgIH0gd2hpbGUobmV4dF9wZXJtdXRhdGlvbihkaXN0LmJlZ2luKCksIGRpc3QuZW5kKCkpKTsKICAgICAgICAvLyBuZXh0X3Blcm11dGF0aW9uIO2VqOyImOuKlCDsnoXroKXrsJvsnYAg67Cw7Je07J2EIOyerOuwsOyXtO2VnCDqsoPrk6Qg7KSRIOyCrOyghOyInOycvOuhnCDri6TsnYwg67Cw7Je07J2EIOuwmO2ZmO2VtOykjC4gCiAgICAgICAgLy8g66eM7JW9IOyjvOyWtOynhCDrsLDsl7TsnbQg7IKs7KCE7Iic7Jy866GcIOuniOyngOuniSDrsLDsl7TsnbTsl4jsnLzrqbQgMOydhCDrsJjtmZgKICAgIH0gICAgCiAgICAKICAgIGlmIChyZXN1bHQgPT0gMTAwMCkgcmV0dXJuIC0xOwogICAgLy8g6rKw6rO86rCAIDEwMDAg7J2066m0IOyWtOuWpCDqsr3smrDrj4Qg7ISx6rO17Iuc7YKk7KeAIOuqu+2VqAogICAgZWxzZSByZXR1cm4gcmVzdWx0OwogICAgLy8g6re4IOyZuOyXkOuKlCDqsrDqs7zrpbwg67CY7ZmYCn0KCgoK