2015 Multi-University Training Contest 2 1004 Delicious Apples(DP)

题目链接

题意:长度为l 的环,有n棵果树,背包容量为k,告诉你k棵苹果树的id,以及每棵树上结的果子数,背包一旦装满要返回起点(id==0)

清空,问你至少走多少路,能摘完所有的苹果。

思路:

因为是环形,所以其实离起点最远的点应该是l / 2;

两种摘苹果的方式,一种从上半圈开始走,用dp[0][i]记录;

另外一种,从下半圈开始走,用dp[1][i]记录;

allv 记录苹果总数,那么只要找出最小的 dp[0][i] + dp[1][all-i]就好啦!

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
const ll INF = 1E18;
ll l, n, k, inf;
ll dp[2][N];
ll allv;

struct node
{
	ll d, v;
	bool operator < (const node &rhs) const{
		return d < rhs.d;
	}
}tree[N];

int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
	{
		allv = 0;
		scanf("%I64d%I64d%I64d", &l, &n, &k);
		for(int i = 0; i < n; i++)
		{
			scanf("%I64d%I64d", &tree[i].d, &tree[i].v);
			allv += tree[i].v;
		}
		sort(tree, tree + n);
		int cnt = 1;
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < tree[i].v; j++)
			{
				int tmp = 0, dis = l;
				if(cnt > k)
				{
					tmp = cnt -k;
				}
				if(2 * tree[i].d  < l)
					dis = 2 * tree[i].d;
				dp[0][cnt] = dp[0][tmp] + dis;
				cnt ++;
			}
		}
		cnt = 1;
		for(int i = n-1; i >= 0; i--)
		{
			for(int j = 0; j < tree[i].v; j++)
			{
				int tmp = 0, dis = l;
				if(cnt > k)
				{
					tmp = cnt -k;
				}
				if((2 * l - 2 * tree[i].d) < l)
					dis = 2*l - 2 * tree[i].d;
				dp[1][cnt] = dp[1][tmp] + dis;
				cnt ++;
			}
		}
		ll ans = INF;
		for(int i = 0; i <= allv; i++)
		{
			ans = min(ans, dp[0][i] + dp[1][allv-i]);
		}
		printf("%I64d\n", ans);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 18:56:02

2015 Multi-University Training Contest 2 1004 Delicious Apples(DP)的相关文章

2015 Multi-University Training Contest 2 1004 Delicious Apples(贪心)

题意:有一个长度为L的环,环上一些点有苹果,每次最多能拿k个苹果,问把全部苹果都拿完所走过的最短距离. 思路:贪心加dp. 首先,如果这个环从中点处割开,那么只需要对两边进行贪心即可,现在连在一起,那么多了一种可能,即绕环一周拿苹果这种方案. 不难证明,至多只可能绕环一次,因为绕环多次可以分为对一侧拿苹果加绕一圈这种方案. 具体实现:将cnt棵苹果树分为n棵每棵上有一个苹果的苹果树,记录每个苹果的位置. 对于两侧,记录拿m个苹果所需要的最小距离,这一步可以用dp实现,即sul[m] = sul[

2015 Multi-University Training Contest 2 1004 Delicious Apples

Delicious Apples Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5303 Mean: 一条长为L的环形路上种着n棵苹果数. 第i棵苹果数的位置在xi,有ai个苹果,苹果树的位置按顺时针顺序给出,且都是整数. 在0位置有一个仓库,有一个容量为k的篮子,需要使用这个篮子将所有苹果收到仓库中来,求全过程的最短路. analyse: 略 Time complexity: O(N) Source code: 

2018 Multi-University Training Contest 1 - B Balanced Sequence (贪心)

题意:对N个由(,)组成的字符串,求拼接后得到的最大的balance序列的长度.balance序列:空串/ A+B(A,B都是b序列)/ (+A+),A为b序列.此三种情况. 分析:在读入N每个字符串时,先将单独一个字符串中的b序列长度提取出来,记录其没有被使用的左弧L和右弧R的数目.因为要使其最后拼接后得到的子序列长度尽可能地大,那么按照贪心的思想,肯定希望左弧多的字符串在前,右弧多的字符串在后,所以要对其排序.但是排序时关键字的比较并不只是简单地比较二者的L与R,而且要先比较自身L与R的大小

2014年百度之星程序设计大赛 - 资格赛 1004 Labyrinth(Dp)

# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix """ #快速排序 import sys import random length = 30 def qsort(arr,left,right): lp = left rp = right if lp == rp:return while True: while arr[lp] >=

HDU 5303 Delicious Apples(贪心 + 背包 2015多校啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5303 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,

hdu5303(2015多校2)--Delicious Apples(贪心+枚举)

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

HDOJ 5303 Delicious Apples 枚举+DP

暴力枚举+DP 虽然是在环上,但最多只需要走一圈... dp[0][i]表示从1...i从起点逆时针走取完i个的花费,有 dp[0][i]=dp[0][i-k]+dist[i]*2 dp[1][i]表示从i...n从起点顺时针走取完n-i+1个的花费 dp[1][i]=dp[1][i+k]+(L-dist[i])*2 枚举哪些点顺时针哪些点逆时针: ans=min(ans,dp[0][i]+dp[1][i+1]); 然后枚举从哪个点开始走一圈:ans=min(ans,dp[0][max(0,i-

2015多校第二场 1004( Delicious Apples )

题意:有一条圆形的路,你的仓库在0点,这条路长l,然后有n个苹果树,每个数的坐标是xi(顺时针),每棵树上有ai个苹果.你有个篮子,能装k个苹果,问你用这个篮子将所有苹果装回仓库所走的最短路为多少? 1≤n,k≤105,ai≥1,a1+a2+...+an≤105 1≤L≤109 0≤x[i]≤L 请特别注意上面的苹果个数的条件.因为我的学长 就是从这个条件成功做出了这道题,orz! 因为苹果数不超过10^5,所以将每个苹果当作点. 用一个数组pos记录每个苹果距0点的距离,排序后,然后就可以用另

HDU5406---CRB and Apple( DP) 2015 Multi-University Training Contest 10

题意比较简单, dp[i][j] 表示上一次男女吃的deliciousness分别为i, j的时候的吃的最多的苹果. 那么dp[i][j] = max(dp[i][k] + 1),   0 <  k <= j dp[i][j] = max( max(dp[k][j]) + 1 ) , 0 < k <= i 对于第一个式子最大值 用树状数组线段树都可以解决, 第二个式子如果每次从0遍历到i再找最值的话,显然会超时. 仔细想想便可以发现第二个最值和第一个是一样的. 这个不好解释. 像是