原题链接__戳我噢

【思路】

(区间)DP

F[I][J]表示前i本书分给j个人用的最短时间

由于每一次j的状态由比j小的状态得出,所以要先枚举j,然后枚举i,接着枚举上一次抄书的人是谁

我觉得,难点在于输出

具体见代码

压行压到手抽筋

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int read(){
char chr=getchar();int f=1,ans=0;
while(!isdigit(chr)) {if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)) {ans=ans*10;ans+=chr-'0';chr=getchar();}
return ans*f;
}
int a[505],f[505][505],n=read(),m=read(),s=0,&ans=f[n][m],num=0,w=n,pre[505],x;
void output(int x){
if(x>0) output(pre[x]-1); else return; if(pre[x]<=0) return;printf("%d %d\n",pre[x],x);}//这里递归输出
int main(){
memset(f,127/2,sizeof(f));memset(pre,0,sizeof(pre));f[0][1]=0;
if(!n&&!m) return 0;//坑点!!!
for(int i=1;i<=n;i++)
a[i]=read(),f[i][1]=f[i-1][1]+a[i];//前i本书都交给第一个人抄(即a[i]的前缀和)
for(int j=2;j<=m;j++)
for(int i=j;i<=n;i++)
for(int k=j;k<=i;k++){
int x=max(f[k-1][j-1],f[i][1]-f[k-1][1]);//取两者最长的抄书时间
if(f[i][j]>x) f[i][j]=x;//取最小值
}
for(int i=n;i>=1;i--){//这里贪心,因为后面的人抄尽量多,前面少,所以倒过来枚举
s+=a[i];
if(s>ans) s=a[i],pre[w]=i+1,w=i;//pre[w]记录这个人抄书的开始位置
}
printf("%d %d\n",1,w);//第一组特判
output(n);//递归输出
return 0;
}

打完收工

hiahiahia~

最新文章

  1. 解决ORA-14450:试图访问已经在使用的事务处理临时表
  2. eclipse中的代码提示功能
  3. lvm[12446]: Another thread is handling an event. Waiting
  4. poj 1159 dp回文串
  5. paper 79:MATLAB函数,interp1
  6. Linux文件目录结构详解
  7. cookie转CookieCollection
  8. Java面试题-Java中的锁
  9. AngularJS 跨站请求- jsonp请求
  10. angular中$q.all用法
  11. 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
  12. es5中的for in 与es6中的for of的用法与区别
  13. Java设计模式之抽象工厂
  14. mysql 日期 字符串
  15. day91-redis
  16. Jemter 压测基础(一)——基本概念、JMeter安装使用、分布式测试、导出测试结果、编写测试报告
  17. 通过swagger将API业务版本号与Gitlab代码版本号绑定
  18. 《算法》第四章部分程序 part 14
  19. Windows Server2008 R2性能优化方法
  20. Pig sample用法举例

热门文章

  1. Origin C调用NAG库
  2. S3C2440时钟体系
  3. CAD动态绘制多段线(com接口)
  4. Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析
  5. 在引入的css或者js文件后面加参数的作用
  6. c/c++排坑(4) -- c/c++中返回局部变量
  7. P2884 [USACO07MAR]每月的费用Monthly Expense
  8. Codevs P1017 乘积最大
  9. Linux下的find命令
  10. PAT 1114 Family Property