搜索的应用--计算最优解:Aizu - ALDS1_4_D Allocation

搜索的应用-计算最优解

题目:

You are given nn packages of wiwi kg from a belt conveyor in order (i=0,1,...n−1i=0,1,...n−1). You should load all packages onto kk trucks which have the common maximum load PP. Each truck can load consecutive packages (more than or equals to zero) from the belt conveyor unless the total weights of the packages in the sequence does not exceed the maximum load PP.

Write a program which reads nn, kk and wiwi, and reports the minimum value of the maximum load PP to load all packages from the belt conveyor.

Input

In the first line, two integers nn and kk are given separated by a space character. In the following nn lines, wiwi are given respectively.

Output

Print the minimum value of PP in a line.

Constraints

  • 1≤n≤100,0001≤n≤100,000
  • 1≤k≤100,0001≤k≤100,000
  • 1≤wi≤10,0001≤wi≤10,000

Sample Input 1

5 3

8

1

7

3

9

Sample Output 1

10

If the first truck loads two packages of {8,1}{8,1}, the second truck loads two packages of {7,3}{7,3} and the third truck loads a package of {9}{9}, then the minimum value of the maximum load PP shall be 10.

Sample Input 2

4 2

1

2

2

6

Sample Output 2

6

If the first truck loads three packages of {1,2,2}{1,2,2} and the second truck loads a package of {6}{6}, then the minimum value of the maximum load PP shall be 6.

思路:

其实这道题目的思路非常简单,就是需要看清楚题目的意思,还有要小心TLE。为:只要卡车的运载量没有达到P,我们就让其按照顺序装货物,最后在计算所有卡车运载量的总和即可。这里以P为实参,编写一个返回可装载货物数v的函数v=f(P)。这函数的算法复杂度为O(n)。然后只要调用这个函数,利用“P增加,v也增加”(严格来说是P增加v也不会减少)的性质,用二分法搜索求P。此时算法的复杂度为O(nlogP)。

代码:

 1 #include <iostream>
 2
 3 using namespace std;
 4 #define MAX 100000
 5 typedef long long llong;
 6 int n,k;
 7 llong T[MAX];
 8
 9 int check(llong P)
10 {
11     int i=0;
12     for(int j=0;j<k;j++)
13     {
14         llong s=0;
15         while(s+T[i]<=P)
16         {
17             s+=T[i];
18             i++;
19             if(i==n) return n;
20         }
21     }
22     return i;
23 }
24
25 int solve()
26 {
27     llong left=0;
28     llong right=100000*10000;
29     llong mid;
30     while(right-left>1)
31     {
32         mid=(right+left)/2;
33         int v=check(mid);
34         if(v>=n) right=mid;
35         else
36             left=mid;
37     }
38     return right;
39 }
40
41 int main()
42 {
43     cin>>n>>k;
44     for(int i=0;i<n;i++)
45     {
46         cin>>T[i];
47     }
48     llong ans=solve();
49     cout<<ans<<endl;
50     return 0;
51 }

总结:

题目说了,是在传送带上依次送来的货物,意思就是说,只要传送带送来了货物,就要将其装载到货车上。而在第一次看到题目的时候没有注意到这个依次,所以,总是弄不明白书上的思路,浪费了很多的时间。

原文地址:https://www.cnblogs.com/lavena/p/10988910.html

时间: 2024-10-10 00:02:19

搜索的应用--计算最优解:Aizu - ALDS1_4_D Allocation的相关文章

搜索中词权重计算及实践

随着网络和信息技术的飞速发展,网络中的信息量也呈现爆炸式的增长,那么快速并且正确从这些海量的数据中获取正确的信息成为了现在搜索引擎技术的核心问题.用户的输入通常呈现很大的差异性,这是因为不同的人接受不同的教育.不同的文化,导致在表述同一个问题上面差异很大,那么对用户输入的搜索词进行词条权重的打分是非常有必要的,这对于从用户输入的搜索词中提取核心词,或是对搜索词返回的文档排序等都是一个非常重要的课题.词权重特征是衡量查询中词的重要度程度,主要应用于相关性排序. 一.TF-IDF 词频-逆文档频率(

PHP实现搜索地理位置及计算两点地理位置间距离的实例

地理位置搜寻LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率.mongodb地理位置索引,2d和2dsphere,对应平面和球面. 1.创建lbs集合存放地点坐标 use lbs; db.lbs.insert( { loc:{ type: "Point", coordinates: [113.332264, 23.156206] }, name: "广州东站" } ) db.lbs.insert( { loc:{ type: &quo

LDA-Latent Dirichlet Allocation 学习笔记

以下内容主要基于<Latent Dirichlet Allocation>,JMLR-2003一文,另加入了一些自己的理解,刚开始了解,有不对的还请各位指正. LDA-Latent Dirichlet Allocation JMLR-2003 摘要:本文讨论的LDA是对于离散数据集,如文本集,的一种生成式概率模型.LDA是一个三层的贝叶斯分层模型,将数据集中每一项,如每个文本,建模为某些未知的topic组成的集合的混合.每个topic又建模为某种混合概率分布.在文本建模中,话题的概率就提供了每

深度优先搜索和广度优先搜索的深入讨论

一.深度优先搜索和广度优先搜索的深入讨论 (一)深度优先搜索的特点是: (1)从上面几个实例看出,可以用深度优先搜索的方法处理的题目是各种各样的.有的搜索深度是已知和固定的,如例题2-4,2-5,2-6:有的是未知的,如例题2-7.例题2-8:有的搜索深度是有限制的,但达到目标的深度是不定的. 但也看到,无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深

深度优先搜索和广度优先搜索的比较与分(转)

深度优先搜索和广度优先搜索的深入讨论   (一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深度优先搜索法有递归以及非递归两种设计方法.一般的,当搜索深度较小.问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂.当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设

保险退保计算

“保险退保计算”!非常遗憾,当你搜索这个词的时候,也许遇到了麻烦.这个麻烦可能来自当初购买时,银行或者是保险公司业务员的忽悠,比如他们告诉您:这是一份高收益理财产品.或者说这是买理财赠送的一份保险. 如果需要保险退保计算方面的技术支撑,应该是保险公司告诉您只能按照现金价值退保!!如果你要查现金价值有多少,只要查下保单背后的现金价值表,您就可以清晰您能退到的保费了.但是您要记住,这个数字与您所交的保费总额可能会存在很大的差额. 如果你已经意识到被骗买了保险,所以开始搜索“保险退保计算”,那么恭喜您

转:谷歌搜索悄然转型争移动主导权

长期以来,谷歌的旗舰产品已经成为我们生活中习以为常的部分.但是谷歌没有懈怠,其搜索服务正悄然转型.谷歌搜索17年来一直都在变 “天空为什么是蓝的?”孩子们经常问会这个问题,但是很少有父母能够立刻给出答案.以前,人们可能在百科全书或去图书馆寻找答案.近年来,父母则可以冲向电脑,在谷歌搜索中输入这个问题,然后打开各种链接,阅读各种解释,最终给孩子答案. 但是到2015年,即使看似很迅速的电脑查询也很少有人去做了.因为与移动设备相比,在电脑上输入搜索问题答案更为复杂.你不仅要在众多链接中选择最相关的链

noip 虫食算 (搜索)

描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制:首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字

【scikit-learn】网格搜索来进行高效的参数调优

 内容概要? 如何使用K折交叉验证来搜索最优调节参数 如何让搜索参数的流程更加高效 如何一次性的搜索多个调节参数 在进行真正的预测之前,如何对调节参数进行处理 如何削减该过程的计算代价 1. K折交叉验证回顾? 交叉验证的过程 选择K的值(一般是10),将数据集分成K等份 使用其中的K-1份数据作为训练数据,另外一份数据作为测试数据,进行模型的训练 使用一种度量测度来衡量模型的预测性能 交叉验证的优点 交叉验证通过降低模型在一次数据分割中性能表现上的方差来保证模型性能的稳定性 交叉验证可以用