[二分] [CodeVS3162] 抄书问题
Description 题目描述
现在要把MMM本有顺序的书分给KKK个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。
Input 输入
第一行两个整数M、KM、KM、K;(0≤K≤M≤500)(0≤K≤M≤500)(0≤K≤M≤500)
第二行MMM个整数,第iii个整数表示第iii本书的页数。
Output 输出
共KKK行,每行两个正整数,第iii行表示第iii个人抄写的书的起始编号和终止编号。KKK行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。
Sample Input 样例输入
9 3
1 2 3 4 5 6 7 8 9
Sample Output 样例输出
1 5
6 7
8 9
Limits 限制
详见试题
Time Limit : 1s1s1s & Memory Limit : 128MB128MB128MB
第一次见到这题是考试的时候
不会啊!!!
什么都没输出,得了10分(rp就这么用光了…)
首先可以dp做
dp[i][j]dp[i][j]dp[i][j]表示前iii页书被jjj个人抄,抄写最多的页数
dp[i][j]dp[i][j]dp[i][j]=min(max(dp[k][i−1],sum[k+1,i]))min(max(dp[k][i-1],sum[k+1,i]))min(max(dp[k][i−1],sum[k+1,i]))
输出贪心思路搞定
上代码
#include <cstdio>
#include <climits>
#define MAXN 1100
using namespace std; int dp[MAXN][MAXN];
int ans[MAXN][2];
int n,k,m,i,j;
int p,q,cnt;
int a[MAXN];
int sum[MAXN]; int mymax(int a,int b)
{ return a>b?a:b;
}
int main()
{ scanf("%d %d",&n,&k); for(i=1;i<=n;i++) for(j=1;j<=k;j++) dp[i][j]=INT_MAX; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; dp[i][1]=sum[i]; } for(m=2;m<=k;m++) for(i=1;i<=n;i++) for(j=1;j<i;j++) { if(dp[i][m]>mymax(dp[j][m-1],sum[i]-sum[j])) dp[i][m]=mymax(dp[j][m-1],sum[i]-sum[j]); } p=n,q=k; for(i=n;i>=1;i--) { cnt+=a[i]; if(cnt>dp[n][k]) { ans[q][0]=i+1; ans[q][1]=p; p=i; q--; cnt=a[i]; } } ans[1][0]=1;ans[1][1]=p; for(int i=1;i<=k;i++) if (ans[i][0]&&ans[i][1]) printf("%d %d\n",ans[i][0],ans[i][1]); return 0;
}
但是有点卡时……
正解是二分答案,类似 NOIP 2015 跳石头的思路。
Code
引用学长一句话:
男人,要直面自己的弱点…
[二分] [CodeVS3162] 抄书问题相关推荐
- codevs-3162 抄书问题
codevs-3162 抄书问题 题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须 ...
- 【二分】抄书 (jzoj 2123)
抄书 题目大意: 有n本书,分给m个人抄,每个人只能拿到连续的书(不能把一本书分开),问抄书最多的人要抄多少页 样例输入 9 3 100 200 300 400 500 600 700 800 900 ...
- Codevs3162抄书问题题解
题目 题目来源 http://codevs.cn/problem/3162/ 题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两 ...
- 【查找】- 二分查找
懒猫老师-二分查找基础知识 代码随想录-二分查找基础知识 1 完全有序 1.1 二分查找 二分查找-力扣题目链接 1.1.1 二分查找 (左闭右闭区间) 1.循环退出条件 注意是 low<=hi ...
- Codevs 抄书问题123
对于抄书问题1,由于标签上写的DP,我就写了DP.... 设dp[I][j]表示前i本书由j个人抄的最小答案,则状态转移方程为 dp[I][j]=min{max(dp[k][j-1],s[I]-s[k ...
- WIKIOI 3162 抄书问题 题解与分析
[题目链接]: http://www.wikioi.com/problem/3162/ [分析]: 这是经典的求最大值最小的问题,用二分答案.二分一个单人抄书的最大值,然后从后向前让每个人尽可能多抄& ...
- CODEVS 3162 3163 3168 抄书问题1 2 3
题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第 ...
- WIKIOI 3163 抄书问题2 题解与分析
[题目链接]: http://www.wikioi.com/problem/3163/ [分析]: 这是经典的求最大值最小的问题,用二分答案.二分一个单人抄书的最大值,然后从后向前让每个人尽可能多抄& ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
最新文章
- 一行代码都不用写,教你如何快速搭建Github博客!!!
- zabbix 监控 elasticsearch
- CentOS下Yum使用
- Spring Boot简介
- day4作业小代码练习
- 16 寸MacBook Pro比14 寸风扇更强大,更耐用
- - 动规讲解基础讲解五——最长公共子序列问题
- nyoj - 168房间安排
- 中国地质大学计算机学院闫继宁,双吸离心泵内部流动模拟与输水管道系统安全问题研究...
- 同志亦凡人第一季/全集BQueer As Folk 1迅雷下载
- WebRTC 概念介绍--一篇读懂source、track、sink、mediastream
- navicat 连接oracle的配置
- 局域网https安全证书解决方案mkcert
- nginx配置反向代理验证ssl证书 双向认证
- 使用PE镜像修改VMware中Windows镜像的方法
- 机械祭天法力无边:练习3.5:编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。
- 【最强规则引擎】-- ICE
- CART算法(机器学习)
- ZUCC_计算机网络实验_实验09 网络基本命令
- 玩转Kaggle:Classify Leaves(叶子分类)——数据分析篇