ねむーの日記~AtCoderな日々~

福岡に住むプログラミング好きのブログです!

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.はじめに

今回も、プログラミング言語C#を使用しています。

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もカウントしてました…