ABC151 C - Welcome to AtCoder
備忘録
問題
回答
"use strict" function Main(input) { input = input.trim().split('\n'); const N = input[0].trim().split(' ').map(Number)[0]; const M = input[0].trim().split(' ').map(Number)[1]; const P = input.slice(1, M+1); let ans = new Array(); for(let i=0; i<N; i++){ ans.push([0, 0]); } for(let i=0; i<M; i++){ let p = P[i].trim().split(' ')[0]; let S = P[i].trim().split(' ')[1]; if(ans[p-1][0] === 1) continue; if(S === 'WA'){ ans[p-1][1] += 1; } else { ans[p-1][0] += 1; } } let ac = 0; let wa = 0; for(let i=0; i<N; i++){ if(ans[i][0] > 0) { ac += ans[i][0]; wa += ans[i][1]; } } console.log(ac, wa); } Main(require("fs").readFileSync("/dev/stdin", "utf8"));
考え方
input
から正答数とペナルティ数を出力する。
正答数
- 初めてACを出した場合
+1
- 2度目以降は加算されない。
ペナルティ数
- 初めてACを出すまでのWA数
- 一度もACを出していない場合にはWA数をペナルティ数として加算しない。
- 一度、ACを出した時、はじめのAC以降のWA数をペナルティ数として加算しない。
上記の条件で正答数とペナルティ数を算出する。
回答コードでは、はじめに2つの値([0, 0]
)を持った長さN
の配列(ans
)を作った。
この2つの値は1つ目の値がACの数、2つ目の値をWAの数とした。
(N
は問題数)
あとは回答した数(M
)だけループし、
上記の条件に従って、配列(ans
)の値を増加させる。
最後に配列(ans
)をすべて確認し、AC(1つ目の値)が1以上の場合には、
1つ目の値をACに加算、2つ目の値をWAに加算した。