hdu 5303 Delicious Apples(dp)

题意:一个长为L的圈种上n颗树,每棵树的坐标为xi,结了ai个苹果,用大小为k的篮子把所有苹果装回来,问最少走多少路

解一:被神奇的dp教做人了

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define ll __int64
#define MIN(a,b) ((a)<(b)?(a):(b))
const int maxn=100005;
using namespace std;
ll dp[3][maxn];
struct aaa
{
    int x,a;
}tree[maxn];
int cmp(aaa a,aaa b)
{
    return a.x<b.x;
}
int main()
{
    int t;
    int l,n,k;
    while(scanf("%d",&t)!=-1)
    {
        while(t--)
        {
            scanf("%d%d%d",&l,&n,&k);
            for(int i=0;i<n;i++)
                scanf("%d%d",&tree[i].x,&tree[i].a);
            sort(tree,tree+n,cmp);
            dp[0][0]=dp[1][0]=0;
            int fr,ed=1;
            for(int i=0;i<n;i++)              //顺时针每个苹果取到时走的路
            {
                for(int j=0;j<tree[i].a;j++)
                {
                    fr=ed-k>0?ed-k:0;
                    dp[0][ed]=dp[0][fr]+(2*tree[i].x>l?l:2*tree[i].x);
                    ed++;
                }
            }
            ed=1;
            ll sum=0;
            for(int i=n-1;i>=0;i--)        //逆时针每个苹果取到时走的路
            {
                sum+=tree[i].a;
                for(int j=0;j<tree[i].a;j++)
                {
                    fr=ed-k>0?ed-k:0;
                    dp[1][ed]=dp[1][fr]+(2*(l-tree[i].x)>l?l:2*(l-tree[i].x));
                    ed++;
                }
            }
            ll lenth=1000000000;
            for(ll i=0;i<=sum;i++)
                lenth=MIN(lenth,dp[0][i]+dp[1][sum-i]);   //找最小的
            printf("%I64d\n",lenth);
        }
    }
    return 0;
}
解二:神奇的贪心,分成两个半圆,左右分别贪到k一下,最后再贪一圈,不过左右贪心从最远的树开始贪

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值