Run ID 作者 问题 语言 测评结果 时间 内存 代码长度 提交时间
83010 sh25_shenpy Sleeping in Class C++ 通过 6 MS 596 KB 2252 2026-01-18 21:20:07

Tests(11/11):


#include <iostream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; // 计算sum的所有因数(用于枚举可能的段数k) unordered_set<int> getFactors(long long sum) { unordered_set<int> factors; for (int i = 1; (long long)i * i <= sum; ++i) { if (sum % i == 0) { factors.insert(i); factors.insert(sum / i); } } return factors; } // 验证是否能分割为k段,每段和为target bool isValid(const vector<int>& a, int k, long long target) { long long current = 0; int count = 0; for (int num : a) { current += num; if (current == target) { // 完成一段 count++; current = 0; } else if (current > target) { // 超过目标,不可行 return false; } } // 必须恰好分割为k段,且最后无剩余 return count == k && current == 0; } int solve(const vector<int>& a, int N) { long long sum = 0; for (int num : a) sum += num; // 总和为0,所有数都是0,无需合并 if (sum == 0) return 0; // 枚举sum的所有因数(可能的段数k),找最大的可行k unordered_set<int> factors = getFactors(sum); vector<int> k_list(factors.begin(), factors.end()); // 降序排序,优先验证大的k(减少合并次数) sort(k_list.rbegin(), k_list.rend()); int max_k = 1; // 至少能合并为1段(所有数合并) for (int k : k_list) { if (k > N) continue; // 段数不能超过原始段数 long long target = sum / k; if (isValid(a, k, target)) { max_k = k; break; // 找到最大的可行k,直接退出 } } // 最小合并次数 = 原始段数 - 最终段数 return N - max_k; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 加速输入输出 int T; cin >> T; while (T--) { int N; cin >> N; vector<int> a(N); for (int i = 0; i < N; ++i) { cin >> a[i]; } cout << solve(a, N) << endl; } return 0; }


测评信息: