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

题意:有一个长度为L的环,环上一些点有苹果,每次最多能拿k个苹果,问把全部苹果都拿完所走过的最短距离。

思路:贪心加dp。

首先,如果这个环从中点处割开,那么只需要对两边进行贪心即可,现在连在一起,那么多了一种可能,即绕环一周拿苹果这种方案。

不难证明,至多只可能绕环一次,因为绕环多次可以分为对一侧拿苹果加绕一圈这种方案。

具体实现:将cnt棵苹果树分为n棵每棵上有一个苹果的苹果树,记录每个苹果的位置。

对于两侧,记录拿m个苹果所需要的最小距离,这一步可以用dp实现,即sul[m] = sul[m-k]+posl[m]。

最后讨论绕圈的问题,绕圈所拿的k个苹果一定要从靠近中点处的苹果中取,即

ans = min(ans, sul[nl-i]+sur[max(nr-K+i, 0)]+L)。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std;  

const int maxn = 100000 + 50;
const int INF = 0x3f3f3f3f;
int L, cnt, K, n, nl, nr;
LL sul[maxn], sur[maxn];
int pos[maxn], posl[maxn], posr[maxn];

int main() {
//	freopen("input.txt", "r", stdin);
	int t; cin >> t;
	while(t--) {
		n = nl = nr = 0;
		scanf("%d%d%d", &L, &cnt, &K);
		while(cnt--) {
			int x, a;
			scanf("%d%d", &x, &a);
			while(a--) pos[++n] = x;
		}
		for(int i = 1; i <= n; i++)
			if(2*pos[i] < L) posl[++nl] = pos[i];
			else posr[++nr] = L - pos[i];
		sort(posl+1, posl+1+nl);
		sort(posr+1, posr+nr+1);
		for(int i = 1; i <= nl; i++)
			if(i > K) sul[i] = sul[i-K] + posl[i]*2;
			else sul[i] = posl[i]*2;
		for(int i = 1; i <= nr; i++)
			if(i > K) sur[i] = sur[i-K] + posr[i]*2;
			else sur[i] = posr[i]*2;
		LL ans = sul[nl] + sur[nr];
		for(int i = 1; i<=nl && i<K; i++) ans = min(ans, sul[nl-i]+sur[max(nr-K+i, 0)]+L);
		cout << ans << endl;
	}
	return 0;
}



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

时间: 2024-11-07 09:28:49

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

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: 

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<cs

2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5312    Accepted Submission(s): 1823 Problem Description Chiaki has an array of

HDU 5303 Delicious Apples (贪心 枚举 好题)

Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 199    Accepted Submission(s): 54 Problem Description There are n apple trees planted along a cyclic road, which is L metres l

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点的距离,排序后,然后就可以用另

杭电2018多校第四场(2018 Multi-University Training Contest 4) 1004.Problem D. Nothing is Impossible (HDU6335) -思维题

6335.Problem D. Nothing is Impossible 题意:给你n道题目,m个人,每题有x个正确选项,y个错误选项,问你做对题数量最多的人做对了多少道题目. 如果一道题有y个错误选项,那么我需要至少y+1个人才能保证一定有一个人做对了这道题目,所以题面上给的正确选项的数量x并没有什么实质性的作用... 假设第一题错误选项有y1个,第二题错误选项有y2个,那么怎么才能保证至少有一个人两道题目都做对了呢? 首先我需要至少y1+1个人才能保证一定有一个人做对了第一题,那么,我在做

2019 Multi-University Training Contest 4.Divide the Stones(贪心)

题意:给你n和k (k|n) 有n个数 第i个数权值为i 要你求权值相同且分成k组 且每组的个数为n/k 思路:恶心构造题,首先对于总权值不能分为k份的 显然不能分成 然后 我们把n/k 分奇偶 我们可以发现 偶数我们可以每k个当成一组 对于奇数 我们可以先处理前3*k 然后同样处理剩下的数 #include <bits/stdc++.h> #define ls(x) T[x].ch[0] #define rs(x) T[x].ch[1] #define fa(x) T[x].fa #defi

Hdu5303 Delicious Apples 贪心

题目链接: HDU5303 题意: 有一条环形的长为L的路,仓库在位置0处, 这条路上有n棵苹果树,给出每棵苹果树的位置和苹果数量, 问用 一次最多能装K个苹果的篮子   把这条路上所有苹果采回仓库最少需要走的距离 解题思路: 这条路是环形的,先把果树分为两部分,圆的左半边算一部分,圆的右半边算另一部分 对所有苹果根据距离排序 , 用类似背包的思想,  统计左半边,右半边用 来回走(来回的长度一定小于一个圆环的周长)的方式采集完苹果所需要走的最少距离; 最后 考虑需要走一圈的情况:左边 多出k1

2015 Multi-University Training Contest 2 hdu 5303 Delicious Apples

Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 1057    Accepted Submission(s): 354 Problem Description There are n apple trees planted along a cyclic road, which is L metres