고민고민 하다가 안되서 질문 올립니다...
제가 이 문제를 어떻게 접근 했냐면 각 날짜가 지날때마다 입는 손실을 계산해서
제안을 하는 사람에게 더해주는 방식으로 했습니다.
예를 들어 M : 10, D : 1 이라고 하고 CUC가 제안을 하는 순서를 나타내면
100000 - (100000 * 0.99) = 1000 창규 = 1000 남은 금액 99000
99000 - (99000 * 0.99) = 990 의종 = 990 남은 금액 98010
마지막 날이 되면 잔액을 마지막에 제안한 사람이 다 갖게 됩니다.
창규 = 1000 + 98010 = 99010
이런식으로 계산하면 예제에 나와있는 것도 다 정상적으로 출력되고, 제가 나름대로
테스트한 입력에 대해서도 정상 출력하는데 이상하게도 WA 가 나와서 ㅠ.ㅠ.............
아래에 소스 올립니다. 혹시 올바른 답이 나오지 않는 케이스 발견해 주시면 감사하겠습니다.
#include
#include
#include
#define MAX_MEMBER 200000
///////////////////////////////////////////////////////////////
// 입력 제어
///////////////////////////////////////////////////////////////
int GetNumCase()
{
int _T;
scanf("%d", &_T);
return _T;
}
void GetNumMD(int M, double *D)
{
scanf("%d", M);
scanf("%lf\n", D);
return;
}
char * InitArray()
{
int i=0;
char *t;
t = (char *)malloc(sizeof(char)(MAX_MEMBER));
t[0] = 1;
while (t[i] != '\n') {
i++;
scanf("%c", &t[i]);
}
t[i] = '\0';
return t;
}
///////////////////////////////////////////////////////////////
// 알고리즘
///////////////////////////////////////////////////////////////
double Division(char *C, int number, int _M, double D)
{
int i;
double M, M_temp, cost=0;
M_temp = (double) _M*10000;
M = M_temp;
for (i=1; i<number; i++) {
M = M * (1-D);
if (C[i] == 'C')
cost = cost + (M_temp - M);
M_temp = M;
}
if ( C[i] == 'C')
cost = cost + M_temp;
return cost;
}
///////////////////////////////////////////////////////////////
// 메인 함수
///////////////////////////////////////////////////////////////
int main()
{
char *C, temp;
int T, C_num, M, i;
double cost, D=0.0;
T = GetNumCase();
for (i=0; i<T; i++) {
GetNumMD(&M, &D);
D = D/100;
C = InitArray();
C_num = strlen(C)-1;
cost = Division(C, C_num, M, D);
printf("%.1f\n", cost);
free(C);
}
return 0;
}
Chaos.PP
고민고민 하다가 안되서 질문 올립니다...
제가 이 문제를 어떻게 접근 했냐면 각 날짜가 지날때마다 입는 손실을 계산해서
제안을 하는 사람에게 더해주는 방식으로 했습니다.
예를 들어 M : 10, D : 1 이라고 하고 CUC가 제안을 하는 순서를 나타내면
100000 - (100000 * 0.99) = 1000 창규 = 1000 남은 금액 99000
99000 - (99000 * 0.99) = 990 의종 = 990 남은 금액 98010
마지막 날이 되면 잔액을 마지막에 제안한 사람이 다 갖게 됩니다.
창규 = 1000 + 98010 = 99010
이런식으로 계산하면 예제에 나와있는 것도 다 정상적으로 출력되고, 제가 나름대로
테스트한 입력에 대해서도 정상 출력하는데 이상하게도 WA 가 나와서 ㅠ.ㅠ.............
아래에 소스 올립니다. 혹시 올바른 답이 나오지 않는 케이스 발견해 주시면 감사하겠습니다.
#include
#include
#include
#define MAX_MEMBER 200000
///////////////////////////////////////////////////////////////
// 입력 제어
///////////////////////////////////////////////////////////////
int GetNumCase()
{
int _T;
scanf("%d", &_T);
return _T;
}
void GetNumMD(int M, double *D)
{
scanf("%d", M);
scanf("%lf\n", D);
return;
}
char * InitArray()
{
int i=0;
char *t;
t = (char *)malloc(sizeof(char)(MAX_MEMBER));
t[0] = 1;
while (t[i] != '\n') {
i++;
scanf("%c", &t[i]);
}
t[i] = '\0';
return t;
}
///////////////////////////////////////////////////////////////
// 알고리즘
///////////////////////////////////////////////////////////////
double Division(char *C, int number, int _M, double D)
{
int i;
double M, M_temp, cost=0;
M_temp = (double) _M*10000;
M = M_temp;
for (i=1; i<number; i++) {
M = M * (1-D);
if (C[i] == 'C')
cost = cost + (M_temp - M);
M_temp = M;
}
if ( C[i] == 'C')
cost = cost + M_temp;
return cost;
}
///////////////////////////////////////////////////////////////
// 메인 함수
///////////////////////////////////////////////////////////////
int main()
{
char *C, temp;
int T, C_num, M, i;
double cost, D=0.0;
T = GetNumCase();
for (i=0; i<T; i++) {
GetNumMD(&M, &D);
D = D/100;
C = InitArray();
C_num = strlen(C)-1;
cost = Division(C, C_num, M, D);
printf("%.1f\n", cost);
free(C);
}
return 0;
}
14년 전