AtCoder が提供しているABC(AtCoder Beginner Contest)364 C問題をC++とPythonで解いてみました。ABC364は、2024年7月27日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 Minimum Glutton(Difficulty : 189)
問題の詳細は、リンク先をご覧ください。
二つの配列をそれぞれ処理します。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 の問題を紹介していきます。