예제 #1
0
        static void Main(string[] args)
        {
            // 入力 N/M, Card の取得
            var inputsNM = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var n        = inputsNM[0];
            var m        = inputsNM[1];

            var cards = Console.ReadLine().Split().Select(long.Parse).ToArray();

            // 操作一覧の取得
            var operations = new CardOperation[m];

            for (var i = 0; i < m; i++)
            {
                var inputsBC = Console.ReadLine().Split().ToArray();
                var b        = int.Parse(inputsBC[0]);
                var c        = long.Parse(inputsBC[1]);
                operations[i] = new CardOperation(b, c);
            }

            // 操作をカードの値の降順に並び替える
            Array.Sort(operations);
            Array.Reverse(operations);

            // 操作によって手に入るN枚までのカード
            var opCards = operations.SelectMany(op => Enumerable.Repeat(op.Number, op.Count)).Take(n).ToArray();

            // 初期カードと操作のカードを合わせて、大きいものからN枚を合計する
            var sum = cards.Concat(opCards).OrderByDescending(x => x).Take(n).Sum();

            // 解答の出力
            Console.WriteLine(sum);
        }