解题报告 之 HDU5303 Delicious Apples


Description

There are n apple trees planted along a cyclic road, which is
L metres long. Your storehouse is built at position 0 on that cyclic road. 

The i-th tree is planted at position xi, clockwise from position
0. There are ai delicious apple(s) on the i-th
tree. 



You only have a basket which can contain at most K apple(s). You are to start from your storehouse, pick all the apples and carry them back to your storehouse using your basket. What is your minimum distance travelled?

1≤n,k≤105,ai≥1,a1+a2+...+an≤105

1≤L≤109

0≤x[i]≤L



There are less than 20 huge testcases, and less than 500 small testcases. 

 

Input

First line: t,
the number of testcases.

Then t testcases
follow. In each testcase:

First line contains three integers, L,n,K.

Next n lines,
each line contains xi,ai.
 

Output

Output total distance in a line for each testcase.
 

Sample Input

2
10 3 2
2 2
8 2
5 1
10 4 1
2 2
8 2
5 1
0 10000
 

Sample Output

18
26

题目大意:一个给定长度为L的圈。你在0位置。

圈上有n个苹果树(给出位置),每棵树下有一定数量的苹果。你有一个能装K个苹果的框子。如今你要将全部苹果运到你所在的位置。问你最少走多少路?


分析:第一点非常easy想到,离起点左右非常近的苹果更倾向于选择原路返回更省。而靠近中间的苹果有可能打包绕一圈再回来更省。

那么问题来了?这个“中间”究竟如何才算中间呢,这个点就是这个题的精髓。

大家能够把这个中间想成一个区间,问题的难点就转化为了怎么选择这个区间。也就是我们要决定选择哪些苹果绕一圈打包回来更省。


这的确是一个难解决的问题。。也是本题巧妙的地方。我们枚举究竟要把那些苹果绕一圈打包带回。我们把一个一个苹果离散出来而不再以苹果树作为考虑对象。并把这些苹果划分为更靠近左边和更靠近右边的。那么我们要枚举的就是,要从左边拿多少个(无疑是最远的那几个)到绕一圈的这个框中。

注意重点在于,从左边最多取K个,也就是仅仅有最后一筐可能须要绕一圈。由于假设从左边取超过K个。那么我们全然能够先取K个依照原路返回的方法(路程一定<=L),那之后问题终于回归不超过K个。


我们枚举的实质事实上在尝试一种平衡局面,使得左右两边选择原路返回路线的框能够尽量利用充分,而不要出现有一趟原路返回仅仅装1、2个苹果。

上代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring> using namespace std;
typedef long long ll; const int MAXN = 1e5 + 10;
ll loc[MAXN];
ll disl[MAXN], disr[MAXN];//依照原路返回策略取完第i个苹果所走的路程
ll ans, L, n, k, cnt;
vector<ll> lloc, rloc; //存储从左右数的苹果位置 int main()
{
int kase;
scanf( "%d", &kase );
while(kase--)
{
memset( disl, 0, sizeof disl );
memset( disr, 0, sizeof disr );
lloc.clear();
rloc.clear();
cnt = 0; scanf( "%lld%lld%lld", &L, &n, &k );
for(int i = 1; i <= n; i++)
{
ll location, number;
scanf( "%lld%lld", &location, &number );
for(int j = 1; j <= number; j++) //离散化
loc[cnt++] = location; } for(int i = 0; i < cnt; i++)
{
if(2 * loc[i] < L)
lloc.push_back( loc[i] );
else
rloc.push_back( L - loc[i] );
}//苹果分边 sort( lloc.begin(), lloc.end() );
sort( rloc.begin(), rloc.end() ); int left = lloc.size(), right = rloc.size(); for(int i = 0; i < left; i++)
disl[i + 1] = (i + 1 <= k ? lloc[i] : disl[i + 1 - k] + lloc[i]);
for(int i = 0; i < right; i++)
disr[i + 1] = (i + 1 <= k ? rloc[i] : disr[i + 1 - k] + rloc[i]); ans = (disl[left] + disr[right]) * 2; //不绕一圈的情况,不要忘了 for(int i = 0; i <= left&&i <= k; i++)//枚举绕一圈的那框从左边取多少
{
ll pickl = left - i;
ll pickr = right - (k - i); ans = min( ans, 2 * (disl[pickl] + disr[pickr]) + L );
} printf( "%lld\n", ans );
}
return 0;
}


解题报告 之 HDU5303 Delicious Apples的更多相关文章

  1. [2015hdu多校联赛补题]hdu5303 Delicious Apples

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5303 题意:在一个长为L的环形路径上种着一些苹果树,告诉你苹果树的位置(题目中以0~L指示坐标)及苹果 ...

  2. Hdu5303 Delicious Apples 贪心

    题目链接: HDU5303 题意: 有一条环形的长为L的路,仓库在位置0处, 这条路上有n棵苹果树,给出每棵苹果树的位置和苹果数量, 问用 一次最多能装K个苹果的篮子   把这条路上全部苹果採回仓库最 ...

  3. hdu5303(2015多校2)--Delicious Apples(贪心+枚举)

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  4. 2015 Multi-University Training Contest 2 hdu 5303 Delicious Apples

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  5. HDU 5303 Delicious Apples (2015多校第二场 贪心 + 枚举)

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  6. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  7. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  8. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

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

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

随机推荐

  1. C#之纯数字判断

    public bool isNaN(string temp) { ; i <temp.Length; i++) { byte tempByte = Convert.ToByte(temp[i]) ...

  2. SQLServer2008 使用sql语句访问excel数据

    exec sp_configure 'show advanced options',1  reconfigure  exec sp_configure 'Ad Hoc Distributed Quer ...

  3. 安卓多线程——AsyncTask

    在采集视频的同时需要对视频进行实时处理,因此要使用到多线程. AsyncTask是android提供的一个处理异步任务的框架,相当于Handler+Thread.相比而言,AsyncTask的优点是封 ...

  4. Visual Basic for Application

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'The note of Visual Basic for Applicati ...

  5. Cache-Control官方文档

    https://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-25#page-21 5.2. Cache-Control The "Cach ...

  6. Django的Error汇总

    title: Django学习笔记 catalog: true subtitle: 11. Django_Error汇总 date: 2018-12-14 10:17:28 --- Django的Er ...

  7. python 直接存入Excel表格

    def write_excels(self, document): outwb = openpyxl.Workbook() outws = outwb.create_sheet(index=0) fo ...

  8. LA 3363

    Run Length Encoding(RLE) is a simple form of compression. RLE consists of the process for searching ...

  9. void 0 与 undefined

    偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined? 如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼? void 0 void是JavaScript的一 ...

  10. python爬虫04 | 长江后浪推前浪,Reuqests库把urllib库拍在沙滩上

    最近 有些朋友 看完小帅b的文章之后 把小帅b的表情包都偷了 还在我的微信 疯狂发表情包嘚瑟 我就呵呵了 只能说一句 盘他 还有一些朋友 看完文章不点好看 还来催更 小帅b也只能说一句 继续盘他   ...