반응형
algospot.com :: FESTIVAL
록 페스티벌 문제 정보 문제 커다란 공연장을 빌려서 록 페스티벌을 개최하려고 합니다. 이 페스티벌은 여러 날 동안 진행되며, 하루에 한 팀의 밴드가 공연장에서 콘서트를 하게 됩니다. 전체 밴드를 몇 팀 섭외할 지는 아직 결정하지 않았지만, 페스티벌의 간판 스타인 L개의 팀은 이미 섭외가 끝난 상태입니다. 따라서 페스티벌은 최소 L일 이상 진행하게 됩니다. 이번에 사용할 공연장은 하루 빌리는 데 드는 비용이 매일 매일 다릅니다. 때문에 공연 일정을 잘 정해
algospot.com
처음에 생각한 풀이 )
첫 팀부터 시작하여 L팀을 선택하여 평균을 구한 후 다음 팀을 확인하여 이미 구한 평균보다 큰 팀이 나오면 다음 루프를 돌리면 된다고 생각했다.
반례 )
5 3
1 4 3 4 1
생각한대로 구현을 하면 (1+4+3) / 3 < 4 이기 때문에 최솟값으로 8/3을 저장한 후 다음 루프를 돌지만
답인 탐색하지 않게 되는 (1+4+3+4+1) / 5이다.
#include <cstdio> // scanf(), printf()
#include <algorithm> // min()
using namespace std;
int main(void)
{
int c, n, l;
int i, j;
double ans;
scanf("%d", &c);
while(c--){
// a[]는 입력으로 받는 각 팀의 비용, b[]는 최솟값을 확인하기 위한 팀 비용의 합
int teamNum, a[1000], b[1000];
ans = 1e9;
scanf("%d%d", &n, &l);
for(int i = 0; i < n; i++)
scanf("%d", a+i);
for(i = 0; i <= n-l; i++){
teamNum = l;
b[i] = 0;
// 최소 팀의 합
for(j = i; j < i+l; j++)
b[i] += a[j];
for(; j < n; j++){
// 평균 이하의 팀만 추가
// 나누기 연산 시 오차 발생 때문에 곱셈 연산 사용
if((double)a[j]*teamNum <= (double)b[i]){
b[i] += a[j];
teamNum++;
}
else
break;
}
ans = min(ans, (double)b[i]/teamNum);
}
printf("%.11f\n", ans);
}
return 0;
}
풀이 )
위에 반례를 통해 모두 탐색해야 된다는 것을 알게 되었으므로 완전탐색을 통해 구했다.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void)
{
int c, n, l;
int i, j, k, sum, check;
int teamNum, a[1000];
double ans;
scanf("%d", &c);
while(c--){
ans = 1e9;
scanf("%d%d", &n, &l);
for(i = 0; i < n; ++i){
scanf("%d", a+i);
}
for(i = 0; i <= n-l; ++i){
for(j = l; j <= n-i; ++j){
sum = 0;
for(k = 0; k < j; ++k){
sum += a[i+k];
}
ans = min(ans, (double)sum / j);
}
}
printf("%.11f\n", ans);
}
return 0;
}
주의점 )
- 자료형 (float -> double)
- 출력 자리 수 (7자리 이상)
반응형
'문제풀이 > 알고스팟' 카테고리의 다른 글
[C++] 알고스팟 - CLOCKSYNC (0) | 2020.12.28 |
---|---|
[C++] 알고스팟 - BOARDCOVER (0) | 2020.12.28 |
[C++] 알고스팟 - PICNIC (0) | 2020.11.01 |