# define _CRT_SECURE_NO_WARNINGS# include <iostream>intarr[2000];intcompare(constvoid*a,constvoid*b){return(*(int*)a-*(int*)b);}intmain(){intt,i,j;inta,b,num,pre,L,R,C;scanf("%d",&t);for(i=0;i<t;i++){scanf("%d %d",&a,&b);//a가 N b가 Knum=a-2;//qsort 범위 정해주기위해pre=1;for(j=0;j<a-1;j++){arr[j]=j+2;}arr[a-1]=2000;for(j=0;j<a-3;j++){//두 명 살아남을때 까지qsort(arr,a,sizeof(int),compare);R=num;L=0;while(L+1<=R){// 2진탐색으로 죽은사람 다음사람찾기 //R이 죽은사람의 다음 사람if(arr[num]<=pre){//마지막 번호가 죽었을 때R=0;break;}C=(L+R)/2;if(arr[C]>pre)R=C;elseif(arr[C]<pre)L=C+1;}if(arr[R+b-1]!=2000){//한 바퀴 아직안돌았을 때pre=arr[R+b-1];arr[R+b-1]=2000;}else{// 한 바퀴 돌았을 때pre=arr[R+b-num-2];arr[R+b-num-2]=2000;}num--;}qsort(arr,a,sizeof(int),compare);printf("%d %d\n",arr[0],arr[1]);}return0;}
조셉푸스 문제입니다. 이진탐색으로 바로 전 죽은 사람의 다음 순서를 찾아내서 다시 다음 번 죽을 사람을 찾는 방법으로 문제를 풀었습니다. 제가 생각해 볼 수 있는 예제랑 기본 예제는 답이 맞다고 하는데 제가 생각하지 못하는 부분이 무엇인지 모르겠습니다 ㅠㅠ 어느 부분에서 틀린 것인지 알 수 있을까요?
설명을 더 하자면 기본예제 6과 3을 입력으로 받았다고 했을 때 크기 6인 배열을 받아 각 배열에 1~6까지 차례대로 입력해줍니다. 그 후 1이 죽으면 1을 100으로 바꿔주고 정렬을 시킵니다. 그리고 이전에 죽은 사람(pre)에 1을 저장해줍니다. 그러면 현재 배열엔 2 3 4 5 6 100 이 들어가 있습니다. 2~6까지 2진탐색을 돌려 1보다 큰 다음 수를 찾습니다. 2를 찾았다면 3번째 후의 차례가 죽어야 함으로 2칸을 이동한 후 결과 값인 4를 죽입니다. 그리고 똑같이 100으로 값을 변경합니다. 그 후 정렬을 하면 2 3 5 6 100 100 이 되고 pre값은 4가 됩니다. 2~6까지의 숫자를 이진탐색을 돌려 4 다음 순서를 찾습니다. 5를 찾았다면 5에서 2칸 이동 후인 2를 죽입니다. 2를 죽인 후 배열에 들어가있는 수는 3 5 6 100 100 100이 되고 pre값은 2가 됩니다. 이를 한번 더 반복하면 3 5 100 100 100 100이 되고 그러므로 값은 3과 5가 됩니다.
mju6229
조셉푸스 문제입니다. 이진탐색으로 바로 전 죽은 사람의 다음 순서를 찾아내서 다시 다음 번 죽을 사람을 찾는 방법으로 문제를 풀었습니다. 제가 생각해 볼 수 있는 예제랑 기본 예제는 답이 맞다고 하는데 제가 생각하지 못하는 부분이 무엇인지 모르겠습니다 ㅠㅠ 어느 부분에서 틀린 것인지 알 수 있을까요?
설명을 더 하자면 기본예제 6과 3을 입력으로 받았다고 했을 때 크기 6인 배열을 받아 각 배열에 1~6까지 차례대로 입력해줍니다. 그 후 1이 죽으면 1을 100으로 바꿔주고 정렬을 시킵니다. 그리고 이전에 죽은 사람(pre)에 1을 저장해줍니다. 그러면 현재 배열엔 2 3 4 5 6 100 이 들어가 있습니다. 2~6까지 2진탐색을 돌려 1보다 큰 다음 수를 찾습니다. 2를 찾았다면 3번째 후의 차례가 죽어야 함으로 2칸을 이동한 후 결과 값인 4를 죽입니다. 그리고 똑같이 100으로 값을 변경합니다. 그 후 정렬을 하면 2 3 5 6 100 100 이 되고 pre값은 4가 됩니다. 2~6까지의 숫자를 이진탐색을 돌려 4 다음 순서를 찾습니다. 5를 찾았다면 5에서 2칸 이동 후인 2를 죽입니다. 2를 죽인 후 배열에 들어가있는 수는 3 5 6 100 100 100이 되고 pre값은 2가 됩니다. 이를 한번 더 반복하면 3 5 100 100 100 100이 되고 그러므로 값은 3과 5가 됩니다.
8년 전