对于抄书问题1,由于标签上写的DP,我就写了DP。。。。
设dp[I][j]表示前i本书由j个人抄的最小答案,则状态转移方程为
dp[I][j]=min{max(dp[k][j-1],s[I]-s[k])},其中s[]为前缀和,k从j-1到1枚举。
输出方案时,由于题目要求多解时使前面的人抄的尽量少,因此可以贪心地输出。
由于我们在前面的DP过程后已经知道了每个人抄书的页数的最大值的最小值dp[m][k],因此可以逆序枚举第i个人,将不超过dp[m][k]的书都交给i抄,然后得出的答案保证前边的人抄书尽可能少,这样就能AC抄书问题1了。时间复杂度
O(k*m^2+k);
#include<iostream>
#define maxn 105
#define inf 0x7fffff
using namespace std;
int m,k,book[maxn],s[maxn];
struct Anses{int from,to;
};
int dp[maxn][maxn];
int main(){ios::sync_with_stdio(false);cin>>m>>k;for(int i=1;i<=m;i++){cin>>book[i];s[i]=s[i-1]+book[i];dp[i][1]=s[i];}for(int i=2;i<=m;i++){for(int j=2;j<=k&&j<i;j++){int minx=inf;for(int k=i-1;k>=1;k--){int maxx=0;if(i-k<j-1)continue;if(maxx<dp[i-k][j-1]) maxx=dp[i-k][j-1];if(maxx<s[i]-s[i-k])  maxx=s[i]-s[i-k];if(minx>maxx) minx=maxx;}dp[i][j]=minx;}}int ansxx=dp[m][k];Anses ans00[maxn];int i=m,k0=k;while(k0){int j=i-1;while(s[i]-s[j]<ansxx&&j>=0) j--;if(s[i]-s[j]==ansxx){ans00[k0].from=j+1;ans00[k0].to=i;k0--;i=j;}else if(s[i]-s[j+1]<=ansxx){ans00[k0].from=j+2;ans00[k0].to=i;k0--;i=j+1;}}for(int i=1;i<=k;i++)cout<<ans00[i].from<<' '<<ans00[i].to<<endl;return 0;
}
但是对于抄书问题2&3,以上DP显然不行,因此得换思路。
刚才的讨论中,DP过程的作用,是求出m本书分成k份的最大代价的最小值,之后贪心地输出就可以了,是不是有二分答案的味道?
我们可以二分查找最大价值的最小值,然后用刚刚所得的贪心策略验证,如果分给了>k个人,说明二分的答案偏小,反之偏大。
但是codevs的数据神坑。。。。。
由于我们刚才的贪心策略,有可能根本用不了K个人就能在最优策略下抄完m本书,此时程序将前边的人分配了0本书!但是根据codevs上的数据,应该是每个人都至少抄一本书,呵呵。。。。
#include<iostream>
#define maxn 1000000+5
using namespace std;
int s[maxn],n,k,begin[maxn],end[maxn];
int main(){ios::sync_with_stdio(false);cin>>n>>k;if(!k)return 0;for(int i=1;i<=n;i++){cin>>s[i];s[i]+=s[i-1];}int lf=1,ri=s[n],ans,mid;for(int i=1;i<=k;i++)begin[i]=end[i]=i;while(lf<ri){drg:;mid=(lf+ri)>>1;int b=n,e=n,cnt=0;while(b>=0){if(s[b]-s[b-1]>mid){lf=mid+1;goto drg;}if(s[e]-s[b-1]<=mid) b--;else{cnt++;e=b;}}cnt++;if(cnt>k) lf=mid+1;else ri=mid;}int b=n,e=n,mark=0;for(int i=k;i>=1;i--){b=e;while(s[e]-s[b-1]<=ri){if(b==i){end[i]=e;for(int i=1;i<=k;i++)cout<<begin[i]<<' '<<end[i]<<endl;return 0;}b--;}end[i]=e;begin[i]=b+1;e=b;}
}

Codevs 抄书问题123相关推荐

  1. H3CNE考试模拟试题

    1. 以下工作于OSI 参考模型数据链路层的设备是__A____.(选择一项或多项) A. 广域网交换机    B. 路由器    C. 中继器    D. 集线器 * A 数据链路层传输的是帧,交换 ...

  2. CODEVS 3162 抄书问题 (复制书稿)

    做这个题,犯了致命错误,wa了几发. 首先要dp,然后必须贪心输出结果,我这个错误以前犯过一次. 输出结果的时候局部最优不一定是全局最优, 因为输出的顺序是倒着来的,而且题目要求是让连续区间中的最大值 ...

  3. CODEVS 3162 3163 3168 抄书问题1 2 3

    题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第 ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 数据结构--栈 codevs 1107 等价表达式

    codevs 1107 等价表达式 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 明 ...

  6. 计算机编程老鸟的心得,java入门123——一个老鸟java学习心得.docx

    java入门123--一个老鸟的java学习心得 学习Java心得体会 学习了一学期的Java课程,觉得是该总结自己的心得体会了.开始学习任何一门课(包括java),兴趣最重要.一直觉得自己在学计算机 ...

  7. 记忆化搜索 codevs 2241 排序二叉树

    codevs 2241 排序二叉树 ★   输入文件:bstree.in   输出文件:bstree.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 一个边长为n的正 ...

  8. java老鸟123怎么样_java入门123——一个老鸟的java学习心得.doc

    java入门123--一个老鸟的java学习心得 java入门123--一个老鸟的java学习心得 篇一:java初学者学习心得 学习Java心得体会 学习了一学期的Java课程,觉得是该总结自己的心 ...

  9. codevs 3287 货车运输 NOIP2013提高组

    题目链接:http://codevs.cn/problem/3287/ 题解: 和bzoj3732一毛一样,只不过是找最大生成树和最小值罢了,具体参见我的bzoj3732的博客 1 #include& ...

最新文章

  1. 设置 页面 内容并排平均显示
  2. 基于GIS的视频管理指挥平台
  3. gnuplot绘图,使用C语言输出
  4. 探究php底层运行机制
  5. java for循环排序_java编程问题。用两个for循环来把输入的整数从小到大排序。
  6. WordPress Terillion Reviews插件HTML注入漏洞
  7. 旧题新做:从idy的视角看数据结构
  8. mysql 索引实战
  9. 解决xx is not in the sudoers file. This incident will be reported.问题
  10. css三种引入方式以及其优先级的说法
  11. IDEA商店无法打开的解决方法
  12. 通过prompt方法增强开放领域问答模型
  13. VS2008无法正确打开项目/解决方案
  14. [CF55D]Beautiful Number 题解
  15. Looking for pthread_create - not found
  16. 如何根据iframe内嵌页面调整iframe高宽续篇
  17. C++(数据结构与算法):16---特殊矩阵的实现(对角矩阵、三对角矩阵、下三角矩阵、上三角矩阵、对称矩阵)
  18. 获取计算机用户名 方法
  19. iPhone6分辨率与适配
  20. matlab向量的简单随机抽样,matlab随机抽样

热门文章

  1. java zip 创建目录_Java实现Zip压缩目录中的所有文件
  2. 分享CFA考试必须杜绝的违规行为!
  3. HBuilder 百度地图的使用
  4. 软件测试常见的智力题
  5. python - 元组,字典,集合
  6. 【百度地图API】如何获取行政区域的边界? (转载)
  7. 归因分析笔记6:SHAP包使用及源码阅读
  8. 【转】ultraedit 正则表达式
  9. 智能优化算法:蜣螂优化算法-附代码
  10. 如何在pc上安装安卓应用程序