【洛谷P1281 书的复制】二分+动态规划
分析
两个做法,一个DP,一个是二分。
二分:也就是二分枚举每个人分到的东西。
DP:区间DP F[I][J]表示前i本书分给j个人用的最短时间 由于每一次j的状态由比j小的状态得出,所以要先枚举j,然后枚举i,接着枚举上一次抄书的人是谁。
AC代码(二分)
#include <bits/stdc++.h>
using namespace std;
int m,k;
int a[505];
inline int read() {
int w=0,x=0; char ch=0;
while (!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return w?-x:x;
}
inline bool check(int x) {
int cnt=0,tmp=0;
for (int i=1;i<=m;i++) {
if (tmp+a[i]>x) tmp=a[i],cnt++;
else tmp+=a[i];
}
if (tmp>0) cnt++;
if (cnt>k) return false;
return true;
}
inline void print(int x) {
int ans[505][2];
int cnt=1,sum=0;
ans[1][1]=m;
for (int i=m;i>=1;i--) {
if (sum+a[i]>x) {
ans[cnt][0]=i+1;
ans[++cnt][1]=i;
sum=a[i];
}
else sum+=a[i];
}
ans[cnt][0]=1;
if (ans[1][0]>m) for (int i=cnt;i>=2;i--) printf("%d %d\n",ans[i][0],ans[i][1]);// 特判
else for (int i=cnt;i>=1;i--) printf("%d %d\n",ans[i][0],ans[i][1]);
}
int main(){
int l=0,r=0,mid=0;
m=read(),k=read();
for (int i=1;i<=m;i++) a[i]=read(),r+=a[i];
while (l<=r) {
mid=(l+r)>>1;
if (!check(mid)) l=mid+1;
else r=mid-1;
}
print(l);
return 0;
}
AC代码(DP)
#include <bits/stdc++.h>
using namespace std;
int f[501][501];
int A[501],Sum[501];
int N,K;
void Print(int x,int Ans) {
if(!x) return;
for(int i=x;i>=0;i--) {
if(Sum[x]-Sum[i-1]>Ans||!i) {
Print(i, Ans);
printf("%d %d\n",i+1,x);
break;
}
}
}
int main() {
scanf("%d%d",&N,&K);
for(int i=1;i<=N;i++) scanf("%d",&A[i]);
for(int i=1;i<=K;i++)
for(int j=1;j<=N; j++)
f[i][j]=1e9;
for(int i=1;i<=N;i++) Sum[i]=Sum[i-1]+A[i],f[1][i]=Sum[i];
for(int i=2;i<=K;i++)
for(int j=1;j<=N;j++)
for(int k=2;k<=j;k++)
f[i][j]=min(f[i][j],max(f[i-1][k-1],Sum[j]-Sum[k-1]));
Print(N,f[K][N]);
return 0;
}
【洛谷P1281 书的复制】二分+动态规划的更多相关文章
- 洛谷 P1281 书的复制 题解
P1281 书的复制 题目背景 大多数人的错误原因:尽可能让前面的人少抄写,如果前几个人可以不写则不写,对应的人输出0 0. 不过,已经修改数据,保证每个人都有活可干. 题目描述 现在要把m本有顺序的 ...
- 洛谷 P1281 书的复制
书的复制 Code: #include <iostream> #include <cstdio> #include <cstring> using namespac ...
- 洛谷P1281 书的复制
题目描述 现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. ...
- P1281 书的复制[二分]
题目描述 现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- 洛谷P3515 [POI2011]Lightning Conductor(动态规划,决策单调性,单调队列)
洛谷题目传送门 疯狂%%%几个月前就秒了此题的Tyher巨佬 借着这题总结一下决策单调性优化DP吧.蒟蒻觉得用数形结合的思想能够轻松地理解它. 首先,题目要我们求所有的\(p_i\),那么把式子变一下 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 洛谷 P1083 借教室【二分+差分/线段树】
二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...
- 【洛谷4769】[NOI2018] 冒泡排序(动态规划_组合数学)
题目: 洛谷 4769 博客页面左下角的嘴嘴瓜封神之战中的题目 分析: 一个排列交换次数为 \(\frac{1}{2}\sum_{i=1}^{n}|i-p_i|\) 的充要条件是这个排列不存在长度为 ...
随机推荐
- zookeeper命令行练习,熟练节点权限, 数组越界异常解决方案
https://www.cnblogs.com/qlqwjy/p/10517231.html zookeeper 创建持久有序节点时候报错,我的版本号是3.4.12, 亲测有效 https://blo ...
- Spring Aop的执行顺序
Spring Aop的执行顺序 首先回忆一下 AOP 的常用注解 @Before:前置通知:目标方法之前执行 @After:后置通知:目标方法之后执行 @AfterReturning:返回后通知:执行 ...
- 「题解」NWRRC2017 Grand Test
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P7025.gym101612G. 题意概述 给你一张有 \(n\) 个点 \(m\) 条边的无向图,无重边无自环, ...
- NX二次开发-通过3x3矩阵获取XYZ轴矢量
函数:UF_CSYS_ask_wcs() 函数说明:通过3x3矩阵获取XYZ轴矢量 用法: 1 #include <uf.h> 2 #include <uf_mtx.h> 3 ...
- 【SQLite】教程01-SQLite简介与安装
为什么要用 SQLite? 不需要一个单独的服务器进程或操作的系统(无服务器的). SQLite 不需要配置,这意味着不需要安装或管理. 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘 ...
- Java @SuppressWarnings:抑制编译器警告-4
Java 中的 @SuppressWarnings 注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素.例如,使用 @Supp ...
- docker2-镜像原理及创建新的镜像
1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...
- Vue3全局APi解析-源码学习
本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...
- 手把手教你IDEA连接码云(Gitee)
目录 前言 一.下载.安装git 1.打开git官网,选择你的操作系统 2.根据你的系统位数选择相应的版本下载 3.安装 4.配置全局的用户名.邮箱 5.在idea中配置git目录 二.配置Gitee ...
- Ubuntu 更换内核
Ubuntu 更换内核步骤: 下载内核源码,例如wget https://git.kernel.org/torvalds/t/linux-4.17-rc2.tar.gz 按照需要的环境,sudo ap ...