题意:

  要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的。每个抄写员的速度是相同的,求所有书抄完所用的最少时间的分配方案。

分析:

  这个题以前做过。就是先二分出来,最大的区间最小值。然后一重循环查找输出/就好

代码:

  

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=505;
int m,k;
long long maxans;
int num[maxn],ans[maxn];
bool judge(long long x)
{
int sum=0,t=k;
int i;
for(i=0;i<m;i++)
{
sum+=num[i];
if(sum>x)
{
i--;
sum=0;
t--;
}
if(!t)
{
if(i!=m-1)
return false;
else
return true;
}
}
return true;
}
void solve()
{
memset(ans,0,sizeof(ans));
long long l,r,mid;
l=0;r=maxans;
while(l<r)
{
mid=(l+r)/2;
if(judge(mid))
r=mid;
else
l=mid+1;
}
int sum=0,i;
for(i=m-1;i>=0;i--)
{
sum+=num[i];
if(sum>r)
{
sum=0;
ans[++i]=1;
k--;
}
}
i=1;
while(k>1)
{
for(;i<m;i++)
{
if(!ans[i])
{
ans[i]=1;
k--;
break;
}
}
}
printf("%d",num[0]);
for(i=1;i<m;i++)
{
if(ans[i])
printf(" /");
printf(" %d",num[i]);
}
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
maxans=0;
scanf("%d%d",&m,&k);
int i;
for(i=0;i<m;i++)
{
scanf("%d",&num[i]);
maxans+=num[i];
}
solve();
}
}

最新文章

  1. GO语言之channel
  2. C# LINQ
  3. poj 1905Expanding Rods
  4. 针对苹果最新审核要求为应用兼容IPv6
  5. DuiLib消息处理剖析
  6. Android之APK文件签名——keytool和jarsigner
  7. iOS监听电话事件
  8. Java并发系列[6]----Semaphore源码分析
  9. ●BZOJ 2007 NOI 2010 海拔
  10. 【Maven】项目打包-war包-Jar包[IDEA将项目打成war包]
  11. PyQt环境配置
  12. ABP实战--分页排序
  13. C#秒转换小时
  14. [翻译] DraggableYoutubeFloatingVideo
  15. Codeforces Round #283 (Div. 2) C. Removing Columns 暴力
  16. PHP 初探
  17. 20155322 2016-2017-2 《Java程序设计》第10周学习总结
  18. Week08《Java程序设计》第八次学习总结
  19. JDK安装目录分析-两个jre和三个lib
  20. [转]Sql server 大数据量分页存储过程效率测试附代码

热门文章

  1. Java中对象的三种状态
  2. BlazeDS简介(转自openkk的日志)
  3. A - Next_permutation
  4. UVA 140 Bandwidth
  5. Marineking wilyin
  6. ZendStudio10 代码格式化 xml
  7. 运算符 - PHP手册笔记
  8. FatMouse&#39; Trade(hdoj1009)
  9. Delphi 线程Timer (TThreadTimer)
  10. DotNet 资源大全(Awesome最新版)