검색결과 리스트
글
문제3 여행
알고리즘.데이터구조
2011. 2. 18. 11:40
여행에 참석한 학생들이 식비, 호텔비, 택시비, 비행기표를 한명씩 부담하고, 나중에 1센트 단위 내에서
쓴 돈이 같아지고, 돈을 주고 받을 때 서로 전달 해야하는 최소액수를 구해보자.
입력
여행에 참석한 학생 수와 각 학생이 부담한 비용을 입력으로 받는다. 단 학생수는 1000명 이하이고,
어떤 학생도 10,000.00 달러 이상 지출하지 않는다. 단위는 달려이고, 0이 입력되면 종료한다.
출력
각 학생이 사용한 금액이 같아지기 위해 전달되어야 하는 금액의 총합
ex)
입력
3
15.00
15.01
3.00
3.01
0
출력
$11.99
해결과정
각 학생이 소비한 금액의 평균을 구해서, 평균액보다 적은 돈을 낸 사람에 대해 평균액과 낸 금액의 차에 합을
구하면 된다. 이 때 1센트 이내에 차이가 있어야 하기 때문에 평균액을 구할 때 소수 셋째짜리에서 반올림을 수행한다.
반올림을 위해, 평균액에 1000을 곱하고, 1의 자리에서 반올림 후 다시 1000으로 나눠주는 과정을 거치게 된다.
/*
입력 : 여행에 참여한 학생수 (정수 n <= 1000), 각 학생이 낸 경비
출력 : 각 학생이 사용한 금액이 같아지기 위한 금액 총합
*/
#include <stdio.h>
#include <stdlib.h>
double total_fee(double* fees, int n);
int main (int argc, char const* argv[])
{
int i, n;
double total, *fees;
scanf("%d", &n);
fees = (double*)malloc(n * sizeof(double));
for (i = 0; i < n; i++) {
scanf("%lf", fees + i);
}
total = total_fee(fees, n);
printf("$%.2lf \n", total);
free(fees);
return 0;
}
double total_fee(double* fees, int n) {
int i, share, rem;
float sum, d_share, total;
sum = d_share = total = 0.0;
for (i = 0; i < n; i++) {
sum += fees[i];
}
share = (sum * 1000) / n;
if ((rem = share % 10) >= 5) {
share += 10;
}
share -= rem;
d_share = share / 1000.0;
for (i = 0; i < n; i++) {
if (fees[i] > d_share) {
total += fees[i] - d_share;
}
}
return total;
}
'알고리즘.데이터구조' 카테고리의 다른 글
| HMAC-SHA1 (0) | 2011.03.11 |
|---|---|
| 문제5 그래픽편집기 (0) | 2011.02.18 |
| 문제4 LCD디스플레이 (0) | 2011.02.18 |
| 문제3 여행 (0) | 2011.02.18 |
| 문제2 지뢰찾기 (0) | 2011.02.18 |
| 문제1 3n+1문제 (0) | 2011.02.18 |
trip_fee.c