Delicious Apples

Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)

Total Submission(s): 587    Accepted Submission(s): 188

Problem 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 ith
tree is planted at position xi,
clockwise from position 0.
There are ai delicious
apple(s) on the ith
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棵苹果树,给出每棵苹果树的位置和苹果的数量,如今一个人在0点的农场里。有一个小篮子。一次能够装k个苹果,问最少走多少距离能够把苹果收回农场。

赛中一看就是贪心的题目,然后就是各种不会啊,当时想了各种办法,又想了各种反例。,,,终于还是不会,。。

赛后补题。结论:表示一定要注意给出的范围的条件呀,尤其是比較特别的。一定实用。

对于摘苹果有几种情况:

1、正向去摘。然后按原路返回

2、反向去摘,然后按原路返回

3、还有就是直接走一圈

这三种方式,前面两个是比較easy解决的,直接去摘就好,特别的是去直接走一圈,假设两側都有非常多。那么直接走一圈一定是浪费的,那么会在什么情况下会变成节省路程的呢?

结果就是假设在圈上仅仅剩下了k个苹果,能够一次摘走,假设这k个在一側,或者在接近0点的两側,那么走半圆是优的;假设在两側并且比較靠下方。那么直接走一圈就是优的。并且走一圈仅仅可能出现一次,否则就能够用半圈来取代了。

题目中给出了全部的苹果不会超过10^5个,让a[i]表示第i个苹果的位置。disr[i]表示正向摘完第i个须要的距离,disl[i]表示反向摘完第i个须要的距离,然后通过它们找出假设没走过整圈须要的最小值,和走一个整圈须要的最小值。当中小的那个是结果。

注意:假设k大于全部的苹果数,那么len的距离一定能够摘完,要特判一下最小值。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define LL __int64
struct node{
int x , a ;
}p[100010];
int a[100010] , cnt ;
LL disl[100010] , disr[100010] ;
int cmp(node t1,node t2) {
return t1.x < t2.x ;
}
int main() {
int t , n , k ;
int i , j ;
LL len , ans ;
scanf("%d", &t) ;
while( t-- ) {
scanf("%d %d %d", &len, &n, &k) ;
for(i = 0 ; i < n ; i++) {
scanf("%d %d", &p[i].x, &p[i].a) ;
}
sort(p,p+n,cmp) ;
cnt = 1 ;
for(i = 0 ; i < n ; i++) {
for(j = 0 ; j < p[i].a ; j++)
a[cnt++] = p[i].x ;
}
memset(disl,0,sizeof(disl)) ;
memset(disr,0,sizeof(disr)) ;
for(i = 1 ; i < cnt ; i++) {
j = max(i-k,0) ;
disr[i] = disr[j] + 2*a[i] ;
}
for(i = cnt-1 ; i > 0 ; i--) {
j = min(i+k,cnt) ;
disl[i] = disl[j] + 2*(len-a[i]) ;
}
ans = 0 ;
for(i = 0 ; i < cnt ; i++) {
if( ans == 0 ) ans = disr[i] + disl[i+1] ;
else ans = min(ans,disr[i]+disl[i+1]) ;
}
for(i = 0 ; i+k+1 <= cnt ; i++)
ans = min(ans,disr[i]+disl[i+k+1]+len) ;
if( k >= cnt ) ans = min(ans,len) ;
printf("%I64d\n", ans) ;
}
return 0 ;
}

hdu5303(2015多校2)--Delicious Apples(贪心+枚举)的更多相关文章

  1. HDU 5303 Delicious Apples (贪心 枚举 好题)

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

  2. Hdu5303 Delicious Apples 贪心

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

  3. 2015 多校联赛 ——HDU5360(贪心+优先队列)

    Sample Input 4 8 4 1 3 2 2 1 0 3 5 3 6 4 2 1 7 6 8 3 3 2 0 5 0 3 6 4 5 2 7 7 6 7 6 8 2 2 3 3 3 0 0 2 ...

  4. hdu 5358 First One 2015多校联合训练赛#6 枚举

    First One Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  5. 2015 多校联赛 ——HDU5371(manacher + 枚举)

    Sample Input 1 10 2 3 4 4 3 2 2 3 4 4   Sample Output Case #1: 9 要求找出一段数字. 将其分成3部分,第①和第②部分成回文字串,第②和第 ...

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

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

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

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

  8. 2015 多校联赛 ——HDU5303(贪心)

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

  9. Delicious Apples (hdu 5303 贪心+枚举)

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

随机推荐

  1. Poj 2096 Collecting Bugs (概率DP求期望)

    C - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

  2. Socket学习进阶之基础通信

    服务端代码: using System; using System.Text; using System.Net; using System.Net.Sockets; public class ser ...

  3. OI 知识体系

    OI Training 知识体系结构 初级 1.1 C语言基础 1.1.1 C语言程序结构(A+B Problem) 1.1.2 变量,常量,数据类型,输入与输出 1.1.3 条件语句 1.1.4 循 ...

  4. 联合权值(NOIP2014)奇特的模拟。。

    原题传送门 这道题瞄了一眼还以为是SPFA最短路. 后面发现距离为2.. 好像可以枚举中间点来着? 时间效率O(n*(2n-2))≍O(n^2) BOOM!(PS:9018上过了,说明数据太水了..) ...

  5. 给Input type='date'赋值

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) 需要使用AngularJS动态给<input type="date" />赋值. 我使用的是ng-bind=&qu ...

  6. Laravel向视图传递变量的两种方法

    //方法一 return view('home.user')->with('datas', $datas); //方法二 return view('home.user.my-indent',co ...

  7. Laravel使用db:seed生成测试数据

    创建 生成数据 定义字段 call方法调用 执行 seeder里如有多个可指定class 整理自www.laravist.com 视频教程

  8. 利用JavaScript打印出Fibonacci数(不使用全局变量)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第4题 - 利用JavaScript打印出Fibonacci数(不使用全局变量) 解题关键: 1.Fibonacci数列的规律 2.递归 解点1:Fibon ...

  9. 计蒜客 18487.Divisions-大数的所有因子个数-Miller_Rabin+Pollard_rho-超快的(大数质因解+因子个数求解公式) (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 F)

    这一场两个和大数有关的题目,都用到了米勒拉宾算法,有点东西,备忘一下. 题目传送门 F. Divisions 传送门 这个题是求一个数的所有因子个数,但是数据比较大,1e18,所以是大数的题目,正常的 ...

  10. Unity3D AssetBundles 动态加载游戏资源

    AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...