AtCoder Beginner Contest 151 C - Welcome to AtCoder
週末にバイキングにいくので楽しみです、ねむーです。
今回はAtCoder(https://atcoder.jp/contests/abc151/tasks/abc151_c)にて開催されました、AtCoder Beginner Contest 151 C問題「C - Welcome to AtCoder」の問題と僕との戦闘記です。
0.はじめに
1.問題文
高橋君は AtCoder のコンテストに参加しています。
このコンテストでは、 N 問の問題が出題されます。
高橋君はコンテスト中に M 回の提出を行いました。
i 回目の提出は p i 番目の問題への提出であり、結果は S i (AC または WA) でした。
高橋君の正答数は、AC を 1 回以上出した問題の数です。
高橋君のペナルティ数は、高橋君が AC を 1 回以上出した各問題において、初めて AC を出すまでに出した WA の数の総和です。
高橋君の正答数とペナルティ数を答えてください。
2.制約
- N , M , p i は整数
- 1 ≤ N ≤ 105
- 0 ≤ M ≤ 105
- 1 ≤ p i ≤ N
- S i は AC か WA のいずれか
3.入出力例
- 入力
2 5 1 WA 1 AC 2 WA 2 AC 2 WA
- 出力
2 2
4.初見の感想
- トータルの問題数でのAC数を出せばよいのでAC数は1変数でOK
5.学びポイント
- 最終的にACしない問題はWAとカウントされない
- WAの数は配列で保持しておく
- その問題がACしたらWA数に加える
6.コードと簡単な解説
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { string[] input = Console.ReadLine().Split(); int N = int.Parse(input[0]); int M = int.Parse(input[1]); //ACしたかどうかのflag bool []flag=new bool[N]; //WAの数を配列で保持 int[] wa_hidden = new int[N]; for (int i = 0; i < N; i++) { flag[i] = false; wa_hidden[i] = 0; } int ac = 0; int wa = 0; for (int i = 0; i < M; i++) { string[] temp = Console.ReadLine().Split(); int p = int.Parse(temp[0])-1; string S = temp[1]; if (flag[p] == false && S == "AC") { //ACしたらWAの数を反映する ac++;flag[p] = true;wa += wa_hidden[p]; } if (flag[p] == false && S == "WA") { wa_hidden[p]++; } } Console.WriteLine(ac+" "+wa); } }
7.最後に
最初WAしたままの問題のWAもカウントしてました…