ABC141 C - Attack Survival
備忘録
問題
回答
"use strict" function Main(input) { input = input.trim().split('\n'); const N = Number(input[0].trim().split(' ')[0]); const K = Number(input[0].trim().split(' ')[1]); const Q = Number(input[0].trim().split(' ')[2]); const A = input.slice(1, Q+1).join(' ').trim().split(' ').map(Number); const ary = new Array(N).fill(K) let ans = {}; for(let i=0; i<Q; i++){ ans[A[i]-1] = ans[A[i]-1] ? ans[A[i]-1] + 1 : 1; } for(let i=0; i<N; i++){ let tmp = 0; if(ans[i]){ tmp = Q - ans[i]; } else { tmp = Q; } if(K - tmp > 0){ console.log('Yes'); } else { console.log('No'); } } } Main(require("fs").readFileSync("/dev/stdin", "utf8"));
考え方
初期ポイントはK
、誰かが正解すると正解した人以外ポイントが-1
されて、
問題はQ
個出題される。
つまり回答した回数をA
とするとき、最後に残るポイントはK - Q + A
となる。
この最後に残ったポイントが0
以上の時Yes
、0
以下の時No
を出力すればよい。
単純にfor
を2つ重ねてAi
を順番に探索、Ai
以外のポイントを-1
とすると、
N
が最大1e5
のため、時間超過になりそうだった。
そのため、はじめに回答者をkey
、回答回数をvalue
とした連想配列を作り、
連想配列に対して、K - 連想配列のvalue > 0
を順に行うことで、答えを出した。
(回答数がない場合、Q
ポイント失っていると考えることができる)