51NOD 1093 骆驼和香蕉
2017-02-05 20:37
211 查看
1093 骆驼和香蕉 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一只骆驼每次最多负重K只香蕉,而它每走1公里要吃掉1只香蕉,不吃完不肯走。现在这只骆驼要去到N公里以外的地方,如果N > K,那么即使骆驼装满了香蕉,也无法1次走到目的地,不过骆驼可以在中途设置一些补给点,先把一些香蕉运过去,下次经过时可以在这些地方进行补给。这样一来便能走到距离 > K的地方。现在给出N和K,问骆驼走到目的地最少需要消耗多少香蕉。 Input 2个整数N K,中间用空格分隔。(1 <= N, K <= 10000,N <= 5 * K) Output 输出最少需要消耗多少根香蕉。 Input示例 1000 500 Output示例 3837 李陶冶 (题目提供者)
卡了大半天…一直以为每次只能走整数公里….
显然 可以贪心 让消耗在回头路的香蕉最小 使得总香蕉消耗最小
假设问题简化为 从0运送b个香蕉到t 在0处需要有多少香蕉 假设 骆驼从 0经过若干中转站运送到中转站s 再从中转站s运到t 令d=t-s 从s->t 可以分解为 运若干香蕉到t 再回到s 重复 f 次 再加上一次从s带若干香蕉到t 路上需要消耗的香蕉数为 (2*f+1)*d 然后问题就转化为 从0运送 b + (2*f+1)*d 个香蕉到s 0处需要有多少香蕉 成功将问题规模缩小 最后一次从s->t 最多能带k-d个到t 前f次来回 需要带 b-k+d个 每次来回最多带 k-2d个 f = (b-k+d)/(k-2d) d = ((f+1)k-b)/(2f+1) 显然 d越小 f越小 通过 while(d<=EPS){ ++f; d=((f+1)*k-b)/(2*f+1); } 确定f大小即可 而且显然 s->z1->z2->z3->t 需要的f依次递减
似乎f的大小遵循1 3 5 7…变化 懒得试了
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<string> #include<vector> #include<deque> #include<queue> #include<algorithm> #include<set> #include<map> #include<stack> #include<time.h> #include<math.h> #include<list> #include<cstring> #include<fstream> #include<queue> #include<sstream> //#include<memory.h> using namespace std; #define ll long long #define ull unsigned long long #define pii pair<int,int> #define INF 1000000007 #define pll pair<ll,ll> #define pid pair<int,double> const double EPS = 1e-9; double dfs(double b,double t,const int k,int f){//从某地s出发 需要带b只香蕉到达t,每次负重最大为k 在s处需要有多少香蕉 if(t<=EPS){ return b; } if(k>b){ double d=k-b; d=min(d,t); double s=t-d; return dfs(b+d,s,k,f);//在s处需要b+d只香蕉 } else{ double d=((f+1)*k-b)/(2*f+1); while(d<=EPS){ ++f; d=((f+1)*k-b)/(2*f+1); } d=min(t,d); double s=t-d; return dfs(b+2*f*d+d,s,k,f); } } int main() { //freopen("/home/lu/Documents/r.txt","r",stdin); //freopen("/home/lu/Documents/w.txt","w",stdout); int n,k; while(~scanf("%d%d",&n,&k)){ double ans = dfs(0,n,k,0); int res=ans; if(ans>=(int)ans+EPS){ res+=1; } printf("%d\n",res); } return 0; }
相关文章推荐
- 51nod 1093 骆驼和香蕉 【贪心】
- 51nod 1093 骆驼和香蕉
- 51nod-1093:骆驼和香蕉
- 骆驼吃香蕉问题
- 骆驼和香蕉的问题
- 骆驼吃香蕉问题
- 骆驼运输香蕉问题解析
- 骆驼吃香蕉的问题 算法智力题
- 【51nod1093】【骆驼和香蕉】【贪心】
- 骆驼吃香蕉
- ZOJ 1093 猴子与香蕉
- 骆驼吃香蕉的问题
- 51Nod-1093-骆驼和香蕉
- 骆驼和香蕉
- 51nod 1087 1 10 100 1000
- 51nod 1049 最大子段和 (动归)
- 51nod-1351:吃点心
- 51nod-1073 约瑟夫环
- 51nod 1009 数字1的数量
- 51Nod - 1050 循环数组最大子段和(dp)