fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 24123 (C++) コンテスト (Contest)
최초 업로드: 2025-08-18 21:44:09
최근 수정 시간: 2025-08-18 21:44:37
게시자: rlatjwls3333
카테고리: 백준
조회수: 7
# [Silver IV] コンテスト (Contest) [문제 링크](https://www.acmicpc.net/problem/24123) ## 문제 설명 <p>世の中には様々なプログラミングコンテストがある.例えば,情報オリンピック,ACM-ICPC,ICFP の 様に世界中の相手と競い合う物や, Supercomputing Contest,パソコン甲子園,EPOCH @まつやまの国内 大会などなど,枚挙にいとまがない.</p> <p>そのようなコンテストに参加していると自分でコンテストを開催したいと考える人もあらわれる.あな たの友人もそんな一人である.友人はコンテストの問題準備に忙しく,コンテストのログから参加者の得点 を計算するプログラムの作成をあなたに依頼してきた.是非とも友人のコンテストが成功するように,間 違いのない得点計算プログラムを作ってあげて欲しい.</p> <p>コンテストの参加者は N 人で,問題が M 問で,競技時間が T 秒である.参加者には 1 から N までの番 号が割り振られている.問題にも 1 から M までの番号が振られている.</p> <p>このコンテストでは,各参加者は問題毎に,問題文を閲覧し,問題を解き,解答のソースコードを提出 する.競技は時刻 0 からはじまり,時刻 T で終了する.参加者が問題を閲覧すると,時刻と参加者番号と 問題番号がログに 1 件の情報として記録される.参加者が解答ソースコードを提出すると,時刻と参加者 番号と問題番号と解答ソースコードの正誤がログに 1 件の情報として記録される.</p> <p>各参加者はコンテスト開始から 1 秒毎に「ある問題を閲覧する」か「ある問題のソースコードを提出す る」のいずれかを 1 回行うことが出来る.閲覧前にその問題のソースコードを提出する事や,正解後に再 度ソースコードを提出する事は出来ない.</p> <p>参加者 j が問題 i を,時刻 S<sub>ij</sub> に閲覧し,w<sub>ij</sub> 回の不正解のソースコードを提出後,時刻 E<sub>ij</sub> に正解のソー スコードを提出したときの得点は,</p> <p style="text-align: center;">(p<sub>i</sub> − (E<sub>ij</sub> − S<sub>ij</sub>) − 120w<sub>ij</sub>) と X のうち大きい方</p> <p>である.ただし,p<sub>i</sub> は問題 i の配点,X は問題番号に依存しない正解した時の最低得点である.</p> <p>競技終了までに,正解しなかった問題の得点は 0 点である.</p> <p>各参加者の得点は,その参加者の問題毎の得点の合計である.</p> <p>N, M, T, X, ログに含まれる情報の件数,各問題の配点,および,ログの内容が与えられたときに各参加 者の得点を計算するプログラムを作成せよ.</p> ## 입력 <p>標準入力から以下の入力を読み込め.</p> <ul> <li>1 行目には,参加者数 N,問題数 M,競技時間 T,正解問題の最低得点 X,ログの件数 Y が空白を区 切りとして書かれている.</li> <li>続く M 行のうち i 行目には,問題 i の得点を表す整数 p<sub>i</sub> が書かれている.</li> <li>続く Y 行はログの内容を表す.それらのうちの k 行目にはログの k 番目の情報が書き込まれており, その情報が記録された時刻を表す整数 t<sub>k</sub>,参加者番号を表す整数 n<sub>k</sub>,問題番号を表す整数 m<sub>k</sub>,およ び “open” , “correct” , “incorrect” のいずれかの文字列が空白区切りで書かれている. “open” は問題を閲覧したことを表す.“correct” は提出したソースコードが正解であったことを表す. “incorrect” は提出したソースコードが不正解であったことを表す.</li> </ul> ## 출력 <p>標準出力に以下のデータを出力せよ.</p> <ul> <li>データは N 行からなり,j 行目は j 番の参加者の得点を含む.</li> </ul> ## 풀이 #### 문제를 연 시간, 틀린 횟수를 기록하여 점수를 구하는 시뮬레이션 문제이다. ``` c++ #include<bits/stdc++.h> using namespace std; int p[11], score[1001], incorrect[1001][11], open[1001][11]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, t, x, y; cin >> n >> m >> t >> x >> y; for(int i=1;i<=m;i++) cin >> p[i]; while(y--) { int tk, nk, mk; string log; cin >> tk >> nk >> mk >> log; if(log[0]=='o') open[nk][mk]=tk; else if(log[0]=='i') incorrect[nk][mk]++; else score[nk] += max(p[mk] - (tk - open[nk][mk]) - 120*incorrect[nk][mk], x); } for(int i=1;i<=n;i++) cout << score[i] << '\n'; } ```