codevs3162抄书问题(划分型dp)
3162 抄书问题
现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本数给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。
第一行两个整数M、K;(K<=M<=100)
第二行M个整数,第i个整数表示第i本书的页数。
共K行,每行两个正整数,第i行表示第i个人抄写的书的起始编号和终止编号。K行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。
9 3
1 2 3 4 5 6 7 8 9
1 5
6 7
8 9
/*
动态规划求出的仅仅是最优值
如果要输出具体方案,还需根据动态规划计算得到的最优值,做一个贪心设计。
具体来说,设最优值为T,那么k个人,每个人抄写最多T页。
从最后一本书开始按逆序将书分配给k人去抄写,从第k个人开始,如果他还能写,就给他;
否则第k个人工作分配完毕,开始分配第k-1个人的工作;以后再是第k-2个、第k-3个、……直至第1个。
一遍贪心结束后,具体的分配方案也就出来了。
本题可以用动态规划解决,设f(k,m)为前m本书交由k个人抄写,需要的最短时间,则状态转移方程为
...看代码吧
*/ #include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
int f[][];
int a[],sum[],li[],ri[];; int main()
{
int m,k;
scanf("%d%d",&m,&k);
for (int i=;i<=m;i++) cin>>a[i];
for (int i=;i<=m;i++) sum[i]=sum[i-]+a[i];
memset(f,,sizeof(f));
for (int i=;i<=m;i++) f[i][]=sum[i];
for (int i=;i<=m;i++)
for (int j=;j<=k&&j<=i;j++)
for (int l=j-;l<i;l++)
{
int last=f[i][j];
f[i][j]=min(f[i][j],max(f[l][j-],sum[i]-sum[l]));
}
int cnt; int s=;
cnt=k;ri[cnt]=m;
for (int i=m;i>=;i--)
if (s+a[i]<=f[m][k])s+=a[i];
else
{
li[cnt]=i+;
cnt--;s=a[i];
ri[cnt]=i;
}
li[]=;
for (int i=;i<=k;i++)
printf("%d %d\n",li[i],ri[i]);
return ;
}
心若向阳,无言悲伤
codevs3162抄书问题(划分型dp)的更多相关文章
- RQNOJ 311 [NOIP2000]乘积最大:划分型dp
题目链接:https://www.rqnoj.cn/problem/311 题意: 给你一个长度为n的数字,用t个乘号分开,问你分开后乘积最大为多少.(6<=n<=40,1<=k&l ...
- codevs1040统计单词个数(区间+划分型dp)
1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超 ...
- Vijos_1218_数字游戏_(划分型动态规划+环状动态规划)
描述 https://vijos.org/p/1218 给出n个数围成一个环,将其划分成k个部分,每个部分求和再对10取模,最后将每个部分的值相乘,求其最大值与最小值. 描述 丁丁最近沉迷于一个数字游 ...
- Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...
- 125.乘积最大(划分性DP)
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Descriptio ...
- 洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)
一看完这道题就知道是划分型dp 有两个点要注意 (1)怎么预处理子串. 表示以i为开头,结尾在j之前(含),有没有子串,有就1,没有就0 (2)dp的过程 这种分成k组最优的题目已经高度模板化了,我总 ...
- 划分型博弈型dp
划分型动态规划: 513. Perfect Squares https://www.lintcode.com/problem/perfect-squares/description?_from=lad ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
随机推荐
- C++关键字:explicit
#include "pch.h" #include <iostream> using namespace std; class BaseClass { public: ...
- python3中post请求里带list报错
这个post请求的数据太长,一般data=,json=就够了. 但是今天这个一直报错,用json吧,报缺少参数,用data吧,报多余[. 后来改成data=,并把数据中的[] 用引号括起来," ...
- A - Restaurant
UVA 1468 Description Mr. Kim is planning to open a new restaurant. His city is laid out as a grid ...
- print pdf bug & DOCTYPE
print pdf bug & DOCTYPE OK with <!DOCTYPE html> <!DOCTYPE html> <html lang=" ...
- [luoguP1095] 守望者的逃离(DP)
传送门 这题....得考虑一些奇奇怪怪的复杂情况 不过也有简便方法. 枚举时间,先算出来只用魔法走的时间. 然后再枚举一遍时间,再算只走的时间,两个比较一下,取最游值. 代码 #include < ...
- Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
E. Lucky Array Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers w ...
- noip模拟赛 猜数字
题目描述 LYK在玩猜数字游戏. 总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi. 我们总能构造出一种方案使得LYK满意.直到…… LY ...
- poj 3237 树链剖分模板(用到线段树lazy操作)
/* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...
- 2.2 convex hull凸包
1.定义:一组平面上的点,求一个包含所有点的最小的凸多边形,就是凸包问题. 利用编程解决凸包问题,应该得到一组逆时针的顶点的顺序集合,在边上但不是顶点,则不包含在集合里. 2.机械的方法:将点所在的位 ...
- 2.1 shuffle sort(洗牌)
1.目的:将数组以随机的顺序重新排序,类似洗牌的过程 2.用途用于快速排序或者任何以划分为基础的排序中,目的是减少最坏可能性发生的概率. 3.想法1:给数组的每一个元素产生一个随机的数字作为键,然后使 ...