hdu5303 Delicious Apples

来源:互联网 发布:爱知时计科技有限公司 编辑:程序博客网 时间:2024/05/17 09:06

Delicious Apples

Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 436    Accepted Submission(s): 133


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?

1n,k105,ai1,a1+a2+...+an105
1L109
0x[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.


#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;long long dp[100001],dp1[100001],a[100001];int main(){int T,n,k,x,y;long long l;scanf("%d",&T);while(T--){scanf("%I64d%d%d",&l,&n,&k);int m=0;for(int i=0;i<n;i++){scanf("%d%d",&x,&y);while(y){y--,m++;a[m]=x;}}sort(a+1,a+m+1);dp[0]=0;dp1[m+1]=0;for(int i=1;i<=m;i++)if(i-k<0) dp[i]=min(a[i]*2,l);else dp[i]=dp[i-k]+min(a[i]*2,l);for(int i=m;i>0;i--)if(i+k>m) dp1[i]=min((l-a[i])*2,l);else dp1[i]=dp1[i+k]+min((l-a[i])*2,l);long long ans=dp[0]+dp1[1];for(int i=1;i<=m;i++)ans=min(ans,dp[i]+dp1[i+1]);printf("%I64d\n",ans);}}


0 0
原创粉丝点击