标签:
一个环上有n个苹果树,每个树上有ai个苹果,你有一个容量为k的篮子,装满苹果后要回到起点清空篮子,问你从起点出发,摘完所有苹果所走的最短路程。
苹果最多有100000个
使用两个DP数组,dp[0][i]表示顺时针取i个苹果的最短路程,dp[1][i]表示逆时针取i个苹果的最短路程
ans=Min(dp[0][i],dp[1][sum-i]);
#include "stdio.h" #include "string.h" #include "algorithm" using namespace std; const __int64 inf=0x3f3f3f3f3f3f; __int64 dp[2][100010],l,k; int n,sum; struct node { __int64 x,y; }a[100010]; bool cmp(node a,node b) { return a.x<b.x; } __int64 Min(__int64 a,__int64 b) { if (a<b) return a; else return b; } void DP() { int last,i,j; memset(dp,0,sizeof(dp)); sum=1; for (i=0;i<n;i++) for (j=1;j<=a[i].y;j++) { if (sum>k) last=sum-k;else last=0; dp[0][sum]=dp[0][last]+Min(2*a[i].x,l); sum++; } sum=1; for (i=n-1;i>=0;i--) for (j=1;j<=a[i].y;j++) { if (sum>k) last=sum-k;else last=0; dp[1][sum]=dp[1][last]+Min(2*(l-a[i].x),l); sum++; } } int main() { __int64 ans; int t,i,cnt; scanf("%d",&t); while (t--) { scanf("%I64d%d%I64d",&l,&n,&k); cnt=0; for (i=0;i<n;i++) { scanf("%I64d%I64d",&a[i].x,&a[i].y); cnt+=a[i].y; } sort(a,a+n,cmp); DP(); ans=inf; for (i=0;i<=cnt;i++) ans=Min(ans,dp[0][i]+dp[1][cnt-i]); printf("%I64d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u011932355/article/details/47043359