From 2f7eb7552b036fdfd4d52b62e15f295ff5852f36 Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Sat, 3 Sep 2022 17:08:35 +0800 Subject: [PATCH] =?UTF-8?q?P1120=20=E5=B0=8F=E6=9C=A8=E6=A3=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://www.luogu.com.cn/record/85778864 --- Luogu/P1120/P1120.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Luogu/P1120/P1120.cpp diff --git a/Luogu/P1120/P1120.cpp b/Luogu/P1120/P1120.cpp new file mode 100644 index 00000000..b4fb0f42 --- /dev/null +++ b/Luogu/P1120/P1120.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 70; + +int n, m, l, a[N], next[N]; +bool vis[N]{false, true}; + +void dfs(int now, int last, int rest) { + if (!rest) { + if (now == m) { + cout << l << endl; + + exit(0); + } + + for (int i = 1; i <= n; i++) { + if (!vis[i]) { + vis[i] = true; + dfs(now + 1, i, l - a[i]); + vis[i] = false; + + break; + } + } + } + + int p = std::lower_bound(a + last + 1, a + n + 1, rest, std::greater()) - a; + + for (int i = p; i <= n; i++) { + if (!vis[i]) { + vis[i] = true; + dfs(now, i, rest - a[i]); + vis[i] = false; + + if (rest == a[i] || rest == l) return; + i = next[i]; + } + } +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n; + + for (int i = 1; i <= n; i++) { + cin >> a[i]; + } + + int sum = std::accumulate(a + 1, a + 1 + n, 0); + + std::sort(a + 1, a + 1 + n, std::greater()); + + for (int i = n; i; i--) { + next[i] = a[i] == a[i + 1] ? next[i + 1] : i; + } + + for (l = a[1]; l <= sum / 2; l++) { + if (sum % l) continue; + + m = sum / l; + dfs(1, 1, l - a[1]); + } + + cout << sum << endl; + + return 0; +}