이건 시간초과로 40점밖에 안나온다. sorting에서 시간을 먹는데 학교에서 배운 O(n^2)알고리즘으로는 무리고
라이브러리 사용해야 하는 것 같다. c에서는 stdlib.h에 있는 qsort가 있다.
static int compare(const void * a, const void * b) {
return (*(int*)a - *(int*)b);
} 이 함수 추가하고
for (i = 0; i < n; i++) {
scanf("%d", &tmp);
arr[i] = tmp;
}
qsort(arr, n, sizeof(int),compare);//sort + input
로 변경해주면 0.1초만에 해결된다.
이 문제에서 많이 헤맸는데 마지막 전 점수에서 동점자가 있을 경우를 생각해봐야 몇 점 이상이 우승후보가 될 수
있는지 알 수 있다. 5 6 7 7 7 같은 경우, 5 5 5 5 5 5 6 6 7 7 7 같이 동점자가 다수인 경우들을 생각해봐야한다.
정렬 후에 n~1까지 각 원소에 더해줘서 최대값을 구해야한다. 이 때 나오는 최대값에서 n을 뺀게 마지막 전에 우승
후보가 되기 위한 최소 점수이다.
#include <stdio.h>
int arr[300000];
int main(void) {
setbuf(stdout, NULL);
int TC;
int test_case;
int i,n;
int count,tmp,max,pos;
scanf("%d", &TC);
for(test_case = 1; test_case <= TC; test_case++) {
count=0,max=0;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &tmp);
if (i == 0) arr[0] = tmp;
else {
pos = 0;
while (arr[pos] < tmp && pos < i) pos++;
for (int j = 1; j<=i-pos; j++) {
arr[i-j+1] = arr[i-j];
}
arr[pos] = tmp;
}
}
for (i = 0; i < n; i++) {
if (arr[i] + n - i > max) max = arr[i] + n - i;
}
printf("Case #%d\n", test_case);
for (i = 0; i < n; i++) {
if (max <= (arr[i]+n)) count++;
}
printf("%d\n", count);
}
return 0;
}
댓글
댓글 쓰기