AcWing 1028. 复制书稿 (二分)

简介: 笔记

1028. 复制书稿


题意

现在要把 m 本有顺序的书分给 k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三和第四本书给同一个人抄写。


现在请你设计一种方案,使得复制时间最短。


复制时间为抄写页数最多的人用去的时间。


思路

因为是求 k 个人中用时最大的最小值 可以想到用二分来解决


mid 为假设的分组后用时最多的那个人消耗的时间


所以把原数组分成区间和小于等于mid 的cnt 段


如果cnt>k 说明 mid 选小了


否则表示mid 选大了 或者mid 正好是解


求出最大值应该是多少之后 再check 一边后就得到了符合题意的分组方式


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
const int N = 600;
int m, k;
int a[N];
int L[N], R[N];
bool check(int x) {
  int sum = 0;
  int cnt = 1;
  R[cnt] = m;
  for (int i = m; i >= 1; --i) {
    if (sum + a[i] <= x)
      sum += a[i];
    else {
      L[cnt] = i + 1;
      R[++cnt] = i;
      sum = a[i];
    }
  }
  L[cnt] = 1;
  return cnt <= k;
}
void solve() {
  cin >> m >> k;
  for (int i = 1; i <= m; ++i) {
    scanf("%d", &a[i]);
  }
  int l = 1, r = 1e9;
  while (l < r) {
    int mid = l + r >> 1;
    if (check(mid))r = mid;
    else l = mid + 1;
  }
  check(l);
  for (int i = k; i >= 1; --i) {
    printf("%d %d\n", L[i], R[i]);
  }
}
int main() {
  solve();
  return 0;
}


目录
相关文章
|
5月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
4月前
|
物联网
【洛谷 P1464】Function 题解(递归+记忆化搜索)
该题目定义了一个递归函数$w(a,b,c)$,具有特定的终止条件和递归规则。当$a, b, c$任一值小于等于0或大于20时,函数有特殊返回值。否则,根据$a, b, c$的相对大小关系应用不同的递归计算。给定输入是一系列的三元组$(a, b, c)$,以$-1,-1,-1$结束。程序使用记忆化搜索优化递归调用,避免重复计算。样例输入输出展示了如何计算$w(1, 1, 1)$和$w(2, 2, 2)$。
28 0
|
算法 C语言 C++
【动态规划】不同路径,编辑距离题解及代码实现
两题由简单到难得DP问题!助我们拿下DP!
54 0
|
移动开发 算法
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
98 0
蓝桥杯AcWing 题目题解 - 递归与递推
蓝桥杯AcWing 题目题解 - 递归与递推
|
人工智能
归并排序求逆序对 acwing例题代码
归并排序求逆序对 acwing例题代码
|
算法 vr&ar C++
【AcWing】双指针算法
这一篇博客也用了双指针算法,同学们可以参考一下
92 0
|
机器学习/深度学习 算法 C++
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)