반응형
구현 문제이다.
다트에 해당하는 점수를 얻는 함수를 구현해야 하는게 일이다.
get 함수에 더러운 if, else if는 그 부분이며 앞 부분은
다트의 Position ( x, y )으로 부터 arctan함수를 사용하여
ceta값을 구하고 다트 판의 점수를 얻는 부분이다.
#define PI 3.141592
#define _d 18
using namespace std;
int get(int x, int y)
{
double ceta = atan2(y, x );
if(ceta<0)
ceta = 2*PI + ceta;
double angle = ceta * 180 / PI;
double first = _d / 2;
if (first + _d > angle && angle > first)
return 13;
else if (first + _d*2 > angle && angle > first + _d)
return 4;
else if (first + _d * 3 > angle && angle > first + _d*2)
return 18;
else if (first + _d * 4 > angle && angle > first + _d*3)
return 1;
else if (first + _d * 5 > angle && angle > first + _d*4)
return 20;
else if (first + _d * 6 > angle && angle > first + _d*5)
return 5;
else if (first + _d * 7 > angle && angle > first + _d*6)
return 12;
else if (first + _d * 8 > angle && angle > first + _d*7)
return 9;
else if (first + _d * 9 > angle && angle > first + _d*8)
return 14;
else if (first + _d * 10 > angle && angle > first + _d*9)
return 11;
else if (first + _d * 11 > angle && angle > first + _d*10)
return 8;
else if (first + _d * 12 > angle && angle > first + _d*11)
return 16;
else if (first + _d * 13 > angle && angle > first + _d * 12)
return 7;
else if (first + _d * 14 > angle && angle > first + _d * 13)
return 19;
else if (first + _d * 15 > angle && angle > first + _d * 14)
return 3;
else if (first + _d * 16 > angle && angle > first + _d * 15)
return 17;
else if (first + _d * 17 > angle && angle > first + _d * 16)
return 2;
else if (first + _d * 18 > angle && angle > first + _d * 17)
return 15;
else if (first + _d * 19 > angle && angle > first + _d * 18)
return 10;
else if (360 >= angle && angle > first + _d * 19)
return 6;
else if (first > angle && angle >= 0)
return 6;
}
int main(int argc, char** argv) {
int T;
int test_case;
/* 아래 freopen 함수는 input.txt 를 read only 형식으로 연 후,
앞으로 표준 입력(키보드) 대신 input.txt 파일로 부터 읽어오겠다는 의미의 코드입니다.
만약 본인의 PC 에서 테스트 할 때는, 입력값을 input.txt에 저장한 후 freopen 함수를 사용하면,
그 아래에서 cin 을 사용하여 표준 입력 대신 input.txt 파일로 부터 입력값을 읽어 올 수 있습니다.
따라서 본인의 PC 에서 테스트 할 때에는 아래 주석을 지우고 이 함수를 사용하셔도 됩니다.
단, 이 시스템에서 "제출하기" 할 때에는 반드시 freopen 함수를 지우거나 주석 처리 하셔야 합니다. */
//freopen("input.txt", "r", stdin);
scanf("%d", &T); //Codeground 시스템에서는 C++ 에서도 scanf 사용을 권장합니다.
for (test_case = 1; test_case <= T; ++test_case) {
// 이 부분에서 알고리즘 프로그램을 작성하십시오.
int A, B, C, D, E;
scanf("%d %d %d %d %d", &A, &B, &C, &D, &E);
int N;
int V = 0;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
int x, y;
scanf("%d %d", &x, &y);
float R = sqrt(x*x+y*y);
if (R < A)
V += 50;
else if (B < R && R < C)// x3
V += get(x, y) * 3;
else if (D < R && R < E)// x2
V += get(x, y) * 2;
else if (R > E)
V += 0;
else
V += get(x, y);
}
// 이 부분에서 정답을 출력하십시오. Codeground 시스템에서는 C++ 에서도 printf 사용을 권장합니다.
printf("Case #%d\n", test_case);
printf("%d\n", V);
}
return 0; // 정상종료 시 반드시 0을 리턴해야 합니다.
}
반응형