B - 引越しできるかな? Editorial
by
seekworser
以下のアルゴリズムでこの問題を AC することができます。
① \(i = 0,\dots,C-1\) について、\(N_i, M_i, L_i\) のうち最も小さいものを \(N'_i\)、2番目に小さいものを \(M'_i\)、3番目に小さいものを \(L'_i\) とする。
② \(N'_i\) の最大値を \(N'_{\text{max}}\)、\(M'_i\) の最大値を \(M'_{\text{max}}\)、\(L'_i\) の最大値を \(L'_{\text{max}}\)、として、\(N'_{\text{max}} \times M'_{\text{max}} \times L'_{\text{max}}\) を出力する。
このアルゴリズムで正しい解が得られる証明をします。 最終的に注文するダンボールについて、最も長い辺は \(L'_{\text{max}}\) 以上です。そうでなければ、\(L'_i = L'_{\text{max}}\) なる \(i\) について、その荷物をいれることができません。 また、最終的に注文するダンボールについて、2 辺以上 \(M'_{\text{max}}\) 以上の長さの辺がある必要があります。なぜならば、\(M'_i = M'_{\text{max}}\) なる \(i\) について、\(L'_i \ge M'_{\text{max}}\)であるため、そのような荷物をいれるダンボールは2辺以上が少なくとも \(M'_{\text{max}}\) 以上です。同様にして、3辺以上が \(N'_{\text{max}}\) であることも示すことができます。
これより、解の下界として \(N'_{\text{max}} \times M'_{\text{max}} \times L'_{\text{max}}\) が得られました。ところで、3辺がそれぞれ \(N'_{\text{max}}, M'_{\text{max}}, L'_{\text{max}}\) であるようなダンボールを注文した場合、このダンボールにすべての荷物を梱包する方法が存在します。なぜならば、全ての \(i\) について\(N'_i \le N'_\text{max}, M'_i \le M'_\text{max}, L'_i \le L'_\text{max}\) であるため、適切に向きを揃えることで梱包が可能であることが分かります。以上により、上述したアルゴリズムで正しい解が得られることが証明できました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int c; cin >> c;
int nmx(0), mmx(0), lmx(0);
for (int i=0; i<c; i++) {
vector<int> a(3);
for (int j=0; j<3; j++) cin >> a[j];
sort(a.begin(), a.end());
if (nmx < a[0]) nmx = a[0];
if (mmx < a[1]) mmx = a[1];
if (lmx < a[2]) lmx = a[2];
}
cout << (nmx * mmx * lmx) << '\n';
}
posted:
last update: