1063 wuli51和京导的毕业旅行

思路

中等题,二分+贪心。

简化题意,将m+1个数字分成n份,ans为这n段中每段数字和的最大值,求ans最小值及其方案。

对于这种求最小的最大值,最常用的方法是二分。答案一定在[0,sum]之间,通过判断是否符合要求可以求得ans。在本题中,ans一定是整数,所以二分过程中left、mid、right也是整数。

如何判断是否符合要求?对于某一mid值,遍历一次露营地距离数组,通过贪心,总是使一天内的行程尽可能接近mid,但不可超过mid。若是加上某一露营地距离超过了mid,代表需要露营一次。最后通过比较露营数cnt与数据要求n-1的大小判断是否符合要求。

那又如何输出方案呢?其实在二分的过程中已经体现了,恰好题目中也是要求前面行程数x尽可能大。所以贪心输出,总是尽可能填满某一天的行程。

贪心还需要注意一个问题,就是输出必须得有n个数,也就是说贪心前得判断一下后面是否有足够的数保准每天都有行程。例如对于n=3,m=2,xi=3,2,1,输出ans应为3,方案应为3,2,1,而不是3,3。

分析

时间复杂度:O(nlgn)。

参考代码

//
// Created by AlvinZH on 2017/12/6.
// Copyright (c) AlvinZH. All rights reserved.
// #include <cstdio> int n, m;
int sum;//行程总和
int D[10005]; bool check(int X)
{
int cnt = 0;
int temp = 0;
for(int i = 1; i <= m; i++)
{
if(D[i] > X) return false;
if(temp + D[i] > X)
{
temp = D[i];
cnt++;
}
else
temp += D[i];
}
return cnt <= n-1;
} int MinMaxX()//二分法求得min(max(xi))
{
int l = 0, r = sum;
while(l <= r)
{
int mid = (l+r) / 2;
if(check(mid))
r = mid - 1;
else
l = mid + 1;
}
return l;
} int main()
{
while(~scanf("%d %d", &n, &m))
{
sum = 0;
m += 1;
for(int i = 1; i <= m; i++)
{
scanf("%d", &D[i]);
sum += D[i];
} int ans = MinMaxX();
printf("%d\n", ans); int cnt = 0;
int temp = 0;
for(int i = 1; i <= m; i++)
{
if(D[i]+temp > ans || n-1 - cnt > m-i)//无法合并||只剩下m-i段,[i+1~m]
{
printf("%d ", temp);
temp = D[i];
cnt++;
}
else
temp += D[i];
}
printf("%d\n", temp);
}
}

2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行的更多相关文章

  1. 2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III

    1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. ...

  2. 2016级算法期末模拟练习赛-F.AlvinZH的青春记忆IV

    1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...

  3. 2016级算法期末模拟练习赛-D.AlvinZH的序列问题

    1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用sh ...

  4. 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I

    1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...

  5. 2016级算法期末模拟练习赛-C.AlvinZH的青春记忆II

    1084 AlvinZH的青春记忆II 思路 中等题,二分. 简化题意,一列数字,每秒会自动-1,特殊操作可以使一个数在1s内-k,问这些数都减至0需要多久. 答案肯定在[1,xMax]之间,采用二分 ...

  6. 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III

    1119 AlvinZH's Fight with DDLs III 思路 难题,最小点覆盖. 分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下 ...

  7. 2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I

    1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp ...

  8. 2016级算法期末上机-B.简单·ModricWang's Fight with DDLs I

    1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\ ...

  9. 2016级算法期末上机-I.难题·ModricWang's Fight with DDLs III

    1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就 ...

随机推荐

  1. YUI前端优化之内容篇

    Excetional Performance团队总结出了一系列可以提高网站速度的方法.可以分为7大类34条.包括内容.服务器.cookie.CSS.JavaScript.图片.移动应用等七部分.一.内 ...

  2. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

  3. Scala程序编译运行

    1.编译 Scala演示代码如下: <pre name="code" class="plain">/** * @author Administrat ...

  4. 别做HR最讨厌的求职者

    有些求职者认为自己各方面都与所应聘的职位要求相匹配,因此在被淘汰之后总是特别不解,努力回忆起每个面试环节,却始终找不到原因.是的,也许你真的很优秀,但是你被淘汰了,原因也许并不大,只是你得罪了HR.其 ...

  5. ERROR Function not available to this responsibility.Change responsibilities or contact your System Administrator.

    APPLIES TO: Navigation:  Help > Diagnostics > Custom Code > Personalize  or  Help > Diag ...

  6. Java Web系列:Spring Security 基础

    Spring Security虽然比JAAS进步很大,但还是先天不足,达不到ASP.NET中的认证和授权的方便快捷.这里演示登录.注销.记住我的常规功能,认证上自定义提供程序避免对数据库的依赖,授权上 ...

  7. 如何将图片嵌入到Html中

    将图片内嵌入到Html中,最好的方法就是用Base64 string.例如:<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg ...

  8. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

  9. Centos7 创建Eclipse启动

    Eclipse是一个集成开发环境(IDE),包含一个基工作区和定制环境的可扩展插件系统.大部分使用 Java 编写,Eclipse 可以用来开发应用程序.通过各种插件,Eclipse 也可以用于其他编 ...

  10. Android Studio如何用真机调试

    1,在真机中设置USB调试模式打开,具体:“设置”->“应用程序”->“开发”->“USB调试”. 2,安装安卓的USB驱动,如果按照不好,那么去下载一个豌豆荚,它会帮你正确安装你的 ...