【二分】小说发表

来源:互联网 发布:牛津西方哲学史 知乎 编辑:程序博客网 时间:2024/04/28 18:38
背景 Background  蛟川书院模拟试题       描述 Description  TOM是一个文学爱好者,在短短一个暑假写了N(1 <= N <= 20)篇短篇小数(每篇小说都在万字以上的!)。TOM看着这些自己的作品非常满意,为此他与自己的语文老师取得了联系,打算精选一些小说发表连载在各级各类报刊杂志上,与老师商量后,联系了期刊出版社,商量决定,打算连载在M(1 <= M <= 20)期期刊报纸上。当然,期刊出版社有个规矩,对同一期上刊登同一作者的文章限制最多T(1 <= T <= 20)兆字节,当然一篇短篇小说不允许分两次刊登连载。
TOM不知如何安排刊登,于是他找到你,要你帮忙解决这个问题,当然他向你提出要求提出了2点要求:
1.小说连载发表必须按照创作的时间顺序刊登在刊物上;
2.刊登的的小说尽可能的多。       输入格式 Input Format  第一行: 三个整数:N, T, M.
第二行: N个整数,分别表示每篇文章的字节(兆字节,都为整数)的长度,按创作时间顺序排列。        输出格式 Output Format  一个整数,表示发表刊登在M期期刊中最多的小说数量       样例输入 Sample Input [复制数据]     

 

 

 

 

样例输出 Sample Output [复制数据]

 

 

 

 

题目分类是动态规划,但是规模太小了,我就用二分+dfs检验了。

做题一定要能静下来!静下来才能避免很多细节错误!

#include <cstdio>#include <cstdlib>#include <string>#include <cstring>long getint(){long rs=0;char tmp;bool sgn=1;do tmp = getchar();while (!isdigit(tmp)&&tmp-'-');if (tmp == '-'){tmp = getchar();sgn=0;}do rs=(rs<<3)+(rs<<1)+tmp-'0';while (isdigit(tmp=getchar()));return sgn?rs:-rs;}long mid;long n,t,m;long len[100];bool can(long sum,long book,long nov,long pos){bool sgn = false;if (nov >= mid)return true;if (book == m+1)return false;for (long i=pos;i<n+1;i++)if (sum + len[i] <= t){if (can(sum+len[i],book,nov+1,i+1))return true;sgn = true;}if (!sgn)if (can(0,book+1,nov,pos))return true;return false;}int main(){freopen("novel.in","r",stdin);freopen("novel.out","w",stdout);n = getint();t = getint();m = getint();long _n = 0;for (long i=1;i<n+1;i++){long tmp = getint();if (tmp <= t){len[++_n] = tmp;}}n = _n;long l = 0;long r = n;long ans = 0;while (l <= r){mid = (l+r)>>1;if (can(0,1,0,1)){if (ans < mid){ans = mid;}l = mid+1;}else{r = mid-1;}}printf("%ld",ans);return 0;}


 

原创粉丝点击