고민고민 하다가 안되서 질문 올립니다...

 

제가 이 문제를 어떻게 접근 했냐면 각 날짜가 지날때마다 입는 손실을 계산해서

 

제안을 하는 사람에게 더해주는 방식으로 했습니다.

 

예를 들어 M : 10, D : 1 이라고 하고 CUC가 제안을 하는 순서를 나타내면

 

100000 - (100000 * 0.99) = 1000      창규 = 1000       남은 금액 99000

 

99000 - (99000 * 0.99) = 990            의종 = 990         남은 금액 98010

 

마지막 날이 되면 잔액을 마지막에 제안한 사람이 다 갖게 됩니다.

 

창규 = 1000 + 98010 = 99010

 

 

이런식으로 계산하면 예제에 나와있는 것도 다 정상적으로 출력되고, 제가 나름대로

 

테스트한 입력에 대해서도 정상 출력하는데 이상하게도 WA 가 나와서 ㅠ.ㅠ.............

 

아래에 소스 올립니다. 혹시 올바른 답이 나오지 않는 케이스 발견해 주시면 감사하겠습니다.

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#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;
}