BOJ1923 Hector的面试 I 贪心
来源:互联网 发布:天音淘宝复制大师侵權 编辑:程序博客网 时间:2024/06/03 23:32
题意:
水晶数g,农民数目p,每个农民的造价c,起始状态金钱数m,游戏结束的秒数d。
每秒每个农民可以制造g个水晶。制造农民不需要时间,任何时刻都行。
思路:
刚开始以为是dp。其实不然。
每一秒内都有固定的p[i]、m[i]。i=0,1,2,3......d;
任何时刻都可以生产农民。
讨论对于第i秒内,可以生产农民数目为:x=0,1,2,3.....xmax.;(xmax=m[i-1]/c);
显然是在第i秒初生产最好,这样再第i秒末就可以多出这一秒这个新农民生产的水晶。
p[i]是第i秒末的人数,即上一秒的人数加上在这一秒初新造出的农民数,即p[i]=p[i-1]+x;
m[i]是第i秒末的钱,m[i]=m[i-1]+(p[i])*g-x*c。
目的是使m[d]得到最大值。写到这里其实就可以进行暴力枚举x的值,这样的时间复杂度为O(x^3);
但是注意到,其实x[i]还有一个约束条件。
假设x[i]取值为k,此时就多出k个农民,这时的代价是k*c,而增益呢?增益其实很好算。
对结果m[d]就是(d-i+1)*k*g。
设y=(d-i+1)*k*g-k*c;
所以如果y>0,即(d-i+1)*g-c>0则这个k值才可取。并且!
此时k值取值唯一:我们要的是y越大越好,即k越大越好,所以取k=m[i-1]/c.
实为好题!
实际代码里p不需要开一个数组,因为每个i的x取值唯一,所以直接每次p=p+x即可。
#include<iostream>using namespace std;const int N=105;int G,P,C,M,D;int m[N];int main(){while(scanf("%d%d%d%d%d",&G,&P,&C,&M,&D)!=EOF){memset(m,0,sizeof(m));m[0]=M;for(int i=1;i<=D;i++){int x=0;if((D-i+1)*G-C>0){x=m[i-1]/C;P=P+x;}m[i]=m[i-1]+P*G-x*C;}printf("%d\n",m[D]);}return 0;}
- BOJ1923 Hector的面试 I 贪心
- 面试考点:i++和++i的区别
- 请教cassandra中hector操作SuperColumn的例子,谢谢!
- Hector——一个高层的Cassandra Java客户端
- Gmapping hector cartogarpher 三种激光雷达算法的比对
- cassandra + hector
- rplidar + hector
- 今天面试时,碰到的经典问题++i与i++
- 程序员面试(0):关于i++,++i,printf的例题
- 话题9 i+++j的计算---贪心规则
- 贪心算法-面试
- Cassandra Hector版DAO
- cassandra hector使用方法
- rplidar进行hector-slam
- hector 源码分析
- ROS hector slam
- ROS Hector mapping
- i公司面试
- flashback
- 布隆过滤器(Bloom Filter)Java实现
- 总结的ASP.NET 常用性能优化方法
- BaconReader:Android版的Reddit阅读器
- Gomez
- BOJ1923 Hector的面试 I 贪心
- Android结束系统中其他进程
- 动态启动,暂定,添加,删除定时功能,可传参数
- c语言 access函数
- 位图文件的存储格式
- vxworks下log信息查看
- 向Spring的bean中直接注入class和枚举类的方法
- VC++的链接错误LNK2005
- 查看 buffer cache 命中率