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

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

AtCoder Beginner Contest 153 C - Fennec vs Monster

久しぶりに晴れている気がします、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc153/tasks/abc153_c)にて開催されました、AtCoder Beginner Contest 153 C問題「C - Fennec vs Monster」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

フェネックは N 体のモンスターと戦っています。

i 番目のモンスターの体力は H i です。

フェネックは次の 2 種類の行動を行うことができます。

  • 攻撃:モンスターを 1 体選んで攻撃することで、そのモンスターの体力を 1 減らす
  • 必殺技:モンスターを 1 体選んで必殺技を使うことで、そのモンスターの体力を 0 にする

攻撃と必殺技以外の方法でモンスターの体力を減らすことはできません。

全てのモンスターの体力を 0 以下にすればフェネックの勝ちです。

フェネックが K 回まで必殺技を使えるとき、モンスターに勝つまでに行う攻撃の回数 (必殺技は数えません) の最小値を求めてください。

2.制約

  • 1 ≤ N ≤ 2 × 105
  • 0 ≤ K ≤ 2 × 105
  • 1 ≤ H i ≤ 109
  • 入力中のすべての値は整数である

3.入出力例

  • 入力
3 0
1000000000 1000000000 1000000000
  • 出力
3000000000

4.初見の感想

  • HPの大きい敵に必殺技を使いたい
  • HPの昇順にソートして、HPの和をK番目から考える
  • オーバーフローに注意してlong型を使用

5.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        string[] input = Console.ReadLine().Split();
        long N = long.Parse(input[0]);
        long K = long.Parse(input[1]);
        long[] H = new long[N];
        input = Console.ReadLine().Split();
        for (long i = 0; i < N; i++)
        {
            H[i] = long.Parse(input[i]);
        }
        Array.Sort(H);
        Array.Reverse(H);
        long ans = 0;
        for(long i = K; i < N; i++)
        {
            ans += H[i];
        }
        Console.WriteLine(ans);
    }
}

6.最後に

実はブログ投稿ツイートのいいねに喜んでいます!