[多校2015.02.1004 dp] hdu 5303 Delicious Apples

Posted yjbjingcha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[多校2015.02.1004 dp] hdu 5303 Delicious Apples相关的知识,希望对你有一定的参考价值。

题意:

在一个长度为L的环上有N棵苹果树。你的篮子容量是K个苹果。

每棵苹果树上都有a[i]个苹果。

问你从0点出发最少要走多少距离能拿完所有的苹果。

思路:

我们考虑dp,dp[0][i]代表顺时针取i个苹果的最短距离。

dp[1][i]代表逆时针取i个苹果的最短距离。

那么设苹果的总是为sum

那么ans=dp[0][i]+dp[sum-i]  (0<=i<=sum)

代码:

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"queue"
#include"map"
#include"vector"
#include"string"
#include"cmath"
using namespace std;
#define ll __int64
ll l;
struct node
{
    int x,s;
} ap[123456];
ll dp[2][123456];
int cmp(node a,node b)
{
    return a.x<b.x;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k;
        scanf("%I64d%d%d",&l,&n,&k);
        for(int i=0; i<n; i++) scanf("%d%d",&ap[i].x,&ap[i].s);
        memset(dp,0,sizeof(dp));
        sort(ap,ap+n,cmp);
        int tep=1,sum=0;       //tep代表取了几个苹果  由于一定是递增的
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<ap[i].s; j++)
            {
                if(tep-k<0) dp[0][tep]=dp[0][0]+min(l,2LL*ap[i].x);
                else dp[0][tep]=dp[0][tep-k]+min(l,2LL*ap[i].x);
                tep++;
            }
        }

        tep=1;
        for(int i=n-1; i>=0; i--)
        {
            sum+=ap[i].s;
            for(int j=0; j<ap[i].s; j++)
            {
                if(tep-k<0) dp[1][tep]=dp[1][0]+min(l,2LL*(l-ap[i].x));
                else dp[1][tep]=dp[1][tep-k]+min(l,2LL*(l-ap[i].x));
                tep++;
            }
        }

        ll ans=999999999999999999LL;
        for(int i=0;i<=sum;i++) ans=min(ans,dp[0][i]+dp[1][sum-i]);
        printf("%I64d\n",ans);
    }
    return 0;
}




以上是关于[多校2015.02.1004 dp] hdu 5303 Delicious Apples的主要内容,如果未能解决你的问题,请参考以下文章

hdu多校第五场1007 (hdu6630) permutation 2 dp

HDU 5389 Zero Escape(dp啊 多校)

2017多校第4场 HDU 6078 Wavel Sequence DP

2017多校第9场 HDU 6170 Two strings DP

2019 hdu多校1

2019HDU多校第一场 BLANK DP