[백준 8932] 7종 경기 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
7개의 육상 종목 기록이 주어졌을 때, 각 종목에 대한 점수를 계산하여 총합을 출력하는 문제입니다. 점수는 각 종목의 공식에 따라 계산되며, 공식은 다음과 같이 구분됩니다:
- 트랙 경기 (100m 허들, 200m, 800m): \(\text{Score} = \left\lfloor A\times (B - P)^C \right\rfloor\)
- 필드 경기 (높이뛰기, 포환던지기, 멀리뛰기, 창던지기): \(\text{Score} = \left\lfloor A\times (P - B)^C \right\rfloor\)
여기서 P
는 선수의 기록이며, A
, B
, C
는 종목별로 주어진 상수입니다.
접근법
- 각 종목의 공식에 필요한 상수
A
,B
,C
를 저장해둡니다. - 선수의 기록
P
가 주어졌을 때,- 트랙 종목인 경우 \(B - P\)를 기준으로,
- 필드 종목인 경우 \(P - B\)를 기준으로 점수를 계산합니다.
- 각 점수를 누적하여 합한 후 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Linq;
using System.Text;
class Program {
static void Main() {
var A = new double[] {9.23076, 1.84523, 56.0211, 4.99087, 0.188807, 15.9803, 0.11193};
var B = new double[] {26.7, 75, 1.5, 42.5, 210, 3.8, 254};
var C = new double[] {1.835, 1.348, 1.05, 1.81, 1.41, 1.04, 1.88};
int[] trackIdx = {0, 3, 6};
int t = int.Parse(Console.ReadLine());
while (t-- > 0) {
var P = Console.ReadLine().Split().Select(long.Parse).ToArray();
long score = 0;
for (int i = 0; i < 7; i++) {
double val = trackIdx.Contains(i) ?
A[i] * Math.Pow(Math.Abs(B[i] - P[i]), C[i]) :
A[i] * Math.Pow(Math.Abs(P[i] - B[i]), C[i]);
score += (long)val;
}
Console.WriteLine(score);
}
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double getScore(double a, double b, double c, ll p) {
return a * pow(abs(b - p), c);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
double a[] = {9.23076, 1.84523, 56.0211, 4.99087, 0.188807, 15.9803, 0.11193};
double b[] = {26.7, 75, 1.5, 42.5, 210, 3.8, 254};
double c[] = {1.835, 1.348, 1.05, 1.81, 1.41, 1.04, 1.88};
int t; cin >> t;
while (t--) {
ll p[7], s = 0;
for (int i = 0; i < 7; i++)
cin >> p[i], s += getScore(a[i], b[i], c[i], p[i]);
cout << s << "\n";
}
return 0;
}