测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A28817. n件物品排成一排,编号分别为: 1、2、3...n身的价值,价值分别为:a1、a2、a3...an请将这 n件物品拆分为k组(不改变物品的顺序),要求每组内至少有一件物品,分别统计每组物品的价值之和,并找出其中的最大值。请设计一种分组方案,使这个最大值尽可能小,并输出这个最大值。例如:n=5,表示有5 件物品,这5 件物品的价值分别是 6、1、3、8、4;k=2,表示要将这 5 件物品拆…

填空题 困难

题目描述

题目描述

n件物品排成一排,编号分别为: 1、2、3...n身的价值,价值分别为:a1、a2、a3...an

请将这 n件物品拆分为k组(不改变物品的顺序),要求每组内至少有一件物品,分别统计每组物品的价值之和,并找出其中的最大值。请设计一种分组方案,使这个最大值尽可能小,并输出这个最大值。

例如:n=5,表示有5 件物品,这5 件物品的价值分别是 6、1、3、8、4;k=2,表示要将这 5 件物品拆分为两组,有如下方案:

1.[6]和 [1,3,8,4],两组物品各自的价值之和为 6和 16,最大值为16;

2.[6,1]和 [3,8,4],两组物品各自的价值之和为 7和 15,最大值为15;

3.[6,1,3]和 [8,4],两组物品各自的价值之和为 10 和 12,最大值为 12;

4.[6,1,3,8]和 [4],两组物品各自的价值之和为 18 和 4,最大值为18;

其中第 3 种方案,价值之和的最大值12 在 4 种方案中最小,故输出12.

输入格式

第一行输入一个整数n(1≤n≤1000),表示物品的数量

第二行输入 n 个整数a1、a2,...an(1≤ai≤105),ai表示i号物品的价值,整数之间以一个空格隔开

第三行输入一个整数k(1≤k≤n),表示将n件物品拆分的组数

输出格式

输出一个整数,表示按照题目要求得到的最大值

输入样例

5
6 1 3 8 4
2

输出样例

12

参考答案

#include <iostream> #include <vector> #include <climits> #include <algorithm> using namespace std; bool check(const vector<int>& values, int mid, int k) { int count = 1; // 分组计数 int sum = 0; for (auto v : values) { if (sum + v > mid) { count++; sum = v; if (count > k) return false; // 如果分组数超过k,则不符合条件 } else { sum += v; } } return true; } int main() { int n, k; cin >> n; vector<int> values(n); int sum_val = 0; int max_val = INT_MIN; for (int i = 0; i < n; i++) { cin >> values[i]; sum_val += values[i]; max_val = max(max_val, values[i]); } cin >> k; // 二分搜索 int left = max_val, right = sum_val; while(left < right) { int mid = left + (right - left) / 2; if (check(values, mid, k)) { // 检查mid是否可行 right = mid; // 尝试降低上界 } else { left = mid + 1; // 如果不可行,提高下界 } } cout << left << endl; // 输出最小的最大值 return 0; }
上一题 下一题