AtCoder

ABC364 C問題(Minimum Glutton)を解く

AtCoder_ABC364_C

AtCoder が提供しているABC(AtCoder Beginner Contest)364 C問題をC++とPythonで解いてみました。ABC364は、2024年7月27日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

C問題 Minimum Glutton(Difficulty : 189)

問題の詳細は、リンク先をご覧ください。

ABC364 C問題 Minimum Glutton

二つの配列をそれぞれ処理します。AtCoder Problems による Difficulty は 189 でした。

解答案

料理に甘さ(配列 $A$)としょっぱさ(配列 $B$)が設定されていますが、別々に処理します。

具体的には、$X$ を超えるまで配列 $A$ の要素を大きい順に加え、その要素数を求めます。同様に $Y$ を超えるまで配列 $B$ の要素を大きい順に加え、その要素数を求めます。求めた要素数の小さい方を出力します。

C++ プログラム例(ABC364C)

配列 a と b を昇順にソートして、条件を満たすまで累積和を求めます。すべての配列の要素を加えても条件を満たさない場合があるため、要素数の初期値を n にしています(23、33行目)。

以下が、C++プログラムです。

#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;

int main()
{
	int n;
	cin >> n;
	ll x, y;
	cin >> x >> y;
	vector<ll> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	vector<ll> b(n);
	for (int i = 0; i < n; ++i) {
		cin >> b[i];
	}

	sort(a.begin(), a.end(), greater<ll>());
	ll a_sum = 0;
	int a_num = n;
	for (int i = 0; i < n; ++i) {
		a_sum += a[i];
		if (a_sum > x) {
			a_num = i + 1;
			break;
		}
	}
	sort(b.begin(), b.end(), greater<ll>());
	ll b_sum = 0;
	int b_num = n;
	for (int i = 0; i < n; ++i) {
		b_sum += b[i];
		if (b_sum > y) {
			b_num = i + 1;
			break;
		}
	}

	cout << min(a_num, b_num) << endl;

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC364C)

Python版も基本的な考え方は同じです。以下がプログラムです。

"""AtCoder Beginner Contest 364 C"""
n, x, y = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))

a.sort(reverse=True)
a_sum = 0
a_num = n
for i in range(n):
    a_sum += a[i]
    if a_sum > x:
        a_num = i + 1
        break
b.sort(reverse=True)
b_sum = 0
b_num = n
for i in range(n):
    b_sum += b[i]
    if b_sum > y:
        b_num = i + 1
        break

print(min(a_num, b_num))

こちらも「AC」と判定されました。

最後に

今回のコンテストでは、A問題C問題E問題の問題名に “glutton” という単語が含まれていました。「大食いの人」を表すようです。

引き続き ABC の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA