hdu 5303 Delicious Apples(dp)
2015-07-27 16:38
246 查看
题意:一个长为L的圈种上n颗树,每棵树的坐标为xi,结了ai个苹果,用大小为k的篮子把所有苹果装回来,问最少走多少路
解一:被神奇的dp教做人了
解一:被神奇的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一下,最后再贪一圈,不过左右贪心从最远的树开始贪
相关文章推荐
- objective-C中category与extension的探究——关于extension(类扩展)的实验和总结
- Android性能优化之SQLite
- error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCom
- Android 判断GPS是否打开
- 【iOS开发】---- 把代码上传到github
- Android开发学习笔记十五 webservice工具类
- 【HDU】5314 Happy King【动态树(点分治)】
- Android 自定义 spinner (背景、字体颜色)
- ios—项目开发需求文档
- MVC模式的原理,它在Android中的运用。
- Cacti+Nagios完全攻略(二)整合cacti与nagios安装部署
- Android实战之 万能的接口回调
- Android TXT文件读写
- Android TXT文件读写 分类: Android 2015-07-27 16:23 13人阅读 评论(0) 收藏
- 开源,免费的移动端触摸滑动插件------swiper介绍----淘抢购时间选择加载产品
- Android仿微信头部下拉菜单
- 【树分治】 HDOJ 5314 Happy King
- Nagios 监控Windows服务器(详细篇)
- nagios 执行check_disk时报错“NRPE: Command 'check_disk' not defined
- Android NDK进入发展