hdu 5303 DP(离散化,环形)+贪心
题目无法正常粘贴,地址:http://acm.hdu.edu.cn/showproblem.php?pid=5303
大意是给出一个环形公路,和它的长度,给出若干颗果树的位置以及树上的果子个数。
起点为0,背包大小为K,求最小走多少距离能摘完所有的果子并回到起点。
观察得知,公路长度L虽然上界10^9,但果子总和最多10^5,还是可做的。
显然如果想回家时在左半边肯定逆时针返回更近,在右边同理顺时针更近。
所有取果子的操作无非三种情况(顺时针出发逆时针返回&&逆时针出发顺时针返回&&顺时针一次走一圈<==>逆时针走一圈)。
*走整圈的情况==>最起码在装完左边的果子之后背包还有富余,不然没有往右走的必要,*而且在整个取果子过程中至多转一圈,否则只会比ans大。
由于背包的大小限制每次取果子的个数,为了方便处理数据,*我们不妨将果子做离散化处理,存进x数组中(x[i]即第i个果子的位置);
我们可以将左/右两边的果子按距离远点的距离排序放入两个l/r容器中。
之后dp1[i]表示从原点顺时针出发取得第i个果子再返回原点所需时间的一半(*保存为一半的距离方便计算),dp2同理.
处理完之后假设不饶圈,ans=dp1[l.size()]+dp2[r.size()];
接着我们枚举绕一圈的拿到的果子数即可,[0,K],而且不能超出左边的果子数,所以[0,min(K,l.size())];
对于此时,左边已经捡走了l.size()-i的果子到起点,右边就是r.size-(K-i),考虑到可能背包剩余空间大于右边的剩余果子,将其与0取较大者即可。
思考过程略复杂但代码量不多,值得多思考思考,精巧之处*号标注。
DP方程dp[i]={ //i从1开始
l[i] i<=k;
l[i]+dp[i-k] i>k;
}
如果第i个果子大于k显然他要走到第i个果子的位置再返回,从路上带走k个果子,如果路上还有则继续返回带走,
在这个过程中如果想要路程最短化,根据贪心,他应该优先带走[1,i]中靠近处的果子,这样再次返回时走的更短。
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define LL long long
LL x[];
LL dp1[],dp2[];
vector<LL> l,r;
int main()
{
int N,M,K,L,T;
int i,j;
LL X,A;
scanf("%d",&T);
while(T--){int cnt=; LL ans;
l.clear(); r.clear();
scanf("%d %d %d",&L,&N,&K);
for(i=;i<N;++i){
scanf("%lld%lld",&X,&A);
for(j=;j<=A;++j)
x[++cnt]=(LL)X;
}
for(i=;i<=cnt;++i){
if(*x[i]<L) l.push_back(x[i]);
else r.push_back(L-x[i]);
}int szl=l.size(),szr=r.size();
sort(l.begin(),l.end());
sort(r.begin(),r.end());
for(i=;i<szl;++i){ dp1[i+]=(i+<=K?l[i]:dp1[i+-K]+l[i]);
}
for(i=;i<szr;++i){
dp2[i+]=(i+<=K?r[i]:dp2[i + -K]+r[i]);
}
ans=(dp1[szl]+dp2[szr])*;
for(i=1;i<=szl&&i<=K;++i){
int p1=szl-i;
int p2=max(,szr-(K-i));
ans=min(ans,*(dp1[p1]+dp2[p2])+L); }
printf("%lld\n",ans);
}
return ;
}
hdu 5303 DP(离散化,环形)+贪心的更多相关文章
- HDU 5303 Delicious Apples(贪心 + 背包 2015多校啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5303 Problem Description There are n apple trees plan ...
- 多校第二场 1004 hdu 5303 Delicious Apples(背包+贪心)
题目链接: 点击打开链接 题目大意: 在一个周长为L的环上.给出n棵苹果树.苹果树的位置是xi,苹果树是ai,苹果商店在0位置,人的篮子最大容量为k,问最少做多远的距离可以把苹果都运到店里 题目分析: ...
- POJ3666 线性dp_离散化_贪心
POJ3666 线性dp_离散化_贪心 就DP而言这个题不算难,但是难就难在贪心,还有离散化的思想上 题目大意:n个土堆,问你最少移动多少单位的图,可以使得这n个土堆变成单调的 dp[i][j]表示前 ...
- hdu 1677 Nested Dolls【贪心解嵌套娃娃问题】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1677 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 【DP】+【贪心】【前缀和】洛谷P2893 [USACO08FEB]修路Making the Grade 题解
正常的没想到的DP和玄学贪心. 题目描述 A straight dirt road connects two fields on FJ's farm, but it changes eleva ...
- POJ - 3666 Making the Grade(dp+离散化)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)
传送门 参考资料: [1]:CodeForces 55D Beautiful numbers(数位dp&&离散化) 我的理解: 起初,我先定义一个三维数组 dp[ i ][ j ][ ...
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
随机推荐
- jquery ztree 刷新后记录折叠、展开状态
ztree :http://www.ztree.me/v3/main.php 项目中用到了这个插件,刚好也有需求 在页面刷新后,保存开始的展开.折叠状态, 其实 dtree: http://www.d ...
- Qt::QWindow多窗口争抢置顶状态解决方案
有时候我们会有这种需求,自己的桌面程序需要置顶,但是程序包含了很多窗口,可能我们要求窗口1,2都在其它桌面程序之上,但是窗口1必须随时在窗口2之上. Qt提供的置顶方式是在windowsflags上增 ...
- tow sum
今天面试好打脸!!! 解决方案方法一:暴力法暴力法很简单.遍历每个元素 xx,并查找是否存在一个值与 target−x 相等的目标元素. public int[] twoSum(int[] nums, ...
- MegaCli 监控raid状态 限戴尔服务器
MegaCli 监控raid状态 MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等.通常 ...
- NGINX:漫谈优化
优化那些事儿 生产环境下网站做前期的优化肯定是比不可少的,简单来说就是用同等条件的硬件资源,处理更多的网站业务,大程度提供网站业务处理能力:前辈留下的实战经验可都是财富,好多坑只有踩过才知道痛,下面就 ...
- Maven的pom文件配置
pom.xml文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...
- (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换
深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...
- Struts,Spring,Hibernate优缺点
Struts跟Tomcat.Turbine等诸 多Apache项目一样,是开源软件,这是它的一大优点.使开发者能更深入的了解其内部实现机制. Struts开放源码框架的创建是为了使开发者在构建基于Ja ...
- python pytz 结合时区的日期操作
有一个安排在2012 年12 月21 日早上9:30 的电话会议,地点在芝加哥.而朋友在印度的班加罗尔,那么他应该在当地时间几点参加这个会议呢? 对几乎所有涉及到时区的问题,你都应该使用pytz 模块 ...
- 微信小程序:全局配置app.json
微信小程序:全局配置app.json 一.全局配置app.json app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包 ...