hdu5303(2015多校2)--Delicious Apples(贪心+枚举)
来源:互联网 发布:abode acrobat for mac 编辑:程序博客网 时间:2024/05/14 12:45
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.
Thei 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 mostK 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.
The
You only have a basket which can contain at most
There are less than 20 huge testcases, and less than 500 small testcases.
Input
First line: t , the number of testcases.
Thent testcases follow. In each testcase:
First line contains three integers,L,n,K .
Nextn lines, each line contains xi,ai .
Then
First line contains three integers,
Next
Output
Output total distance in a line for each testcase.
Sample Input
210 3 22 28 25 110 4 12 28 25 10 10000
Sample Output
1826
题目大意:有一个圈,圈的长度是l,在正上方是0点,在圈上有n棵苹果树,给出每棵苹果树的位置和苹果的数量,现在一个人在0点的农场里,有一个小篮子,一次可以装k个苹果,问最少走多少距离可以把苹果收回农场。
赛中一看就是贪心的题目,然后就是各种不会啊,当时想了各种办法,又想了各种反例,,,,最终还是不会,,,
赛后补题,结论:表示一定要注意给出的范围的条件呀,尤其是比较特别的,一定有用。
对于摘苹果有几种情况:
1、正向去摘,然后按原路返回
2、反向去摘,然后按原路返回
3、还有就是直接走一圈
这三种方式,前面两个是比较容易解决的,直接去摘就好,特别的是去直接走一圈,如果两侧都有很多,那么直接走一圈一定是浪费的,那么会在什么情况下会变成节省路程的呢?
结果就是如果在圈上只剩下了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 __int64struct 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 ;}
0 0
- hdu5303(2015多校2)--Delicious Apples(贪心+枚举)
- HDU5303 Delicious Apples(贪心)
- Hdu5303 Delicious Apples 贪心
- Delicious Apples(贪心+枚举)
- HDU5303 Delicious Apples【贪心】【DP】
- 2015 Multi-University Training Contest 2 1004 Delicious Apples(HDU5303)
- hdu5303 Delicious Apples
- hdu5303 Delicious Apples
- HDU 5303 Delicious Apples(贪心 + 背包 2015多校啊)
- HDU 5303 Delicious Apples(DP + 贪心)
- hdu 5303 Delicious Apples(贪心)
- HDU 5303 Delicious Apples 2015 Multi-University Training Contest 2 1004(贪心)
- Delicious Apples (hdu 5303 贪心+枚举)
- 解题报告 之 HDU5303 Delicious Apples
- HDU 5303 delicious apples(贪心+离散化)好题
- HDU 5303 Delicious Apples (2015多校第二场 贪心 + 枚举)
- HDU 5303 Delicious Apples (贪心 枚举 好题)
- 2015 Multi-University Training Contest 2 1004 Delicious Apples(DP)
- 欢迎使用CSDN-markdown编辑器
- Spark工作模式与RDD
- swift基础语法
- java平台统一异常框架的设计与实现
- C++中引用不能重新赋值的理解
- hdu5303(2015多校2)--Delicious Apples(贪心+枚举)
- 地质地貌卫星影像集锦(三 矿产资源篇)
- AGTC(动态规划-最短编辑距离)
- Java开发中的23种设计模式详解(转)
- 图像处理------高斯金字塔
- Sobel(索贝尔)边缘检测算子分析及opencv程序测试
- 如何让tomcat自动部署web项目
- TableView和ListView的使用
- ImageView---拍照或从相册取图片并裁剪