작성일 :

문제 링크

8932번 - 7종 경기

설명

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