HDU-4803-贪心+卡精度(挺难的)

来源:互联网 发布:淘宝怎么和卖家聊天 编辑:程序博客网 时间:2024/05/16 15:50

给定一个电子版,上面显示数量,下面显示总价格。按上面的按钮,数量会加一,总价格也会加上一个单价,按下面,总价格加一,
问最少按几个,可以得到想要的那个结果。
第一次写的时候,听后面人说了一句状态压缩dp,我一看数据范围好像哦。。可是怎么也想不开。。
后来看题解才发现是贪心。
把y分成x份(给定的目标数),然后在对每一份进行加y的操作,不然y太多了肯定会超时。代码有解释。

#include <iostream>#include <cmath>#include <cstdio>#include <cstring>#include <vector>using namespace std;const double EPS=1e-5;//这道题的想法是贪心,看了好多题解,后来看了一个,eps太多,连次数也加,我一点都理解不了。//后来看了这个才理解了。/*一个 x,一个y,发现是单价的问题,不管怎么弄,单价都在增加,最大的单价就是那个初始y/x的,这样就好办了。把y分成x份,每一份都进行加。而x变得次数已经被提前预定了。需要判定的就是当y的精度太大的时候就出不来了,*/int main(){   double x,y;    while(~scanf("%lf%lf",&x,&y))    {   //int  a=1;       double   b=1;        if(x>y)        {   cout<<"-1"<<endl;            continue;        }        int time=int(x)-1;        double xl=(y+1-0.000001)/x;//斜率        for(int i=1;i<=(int)x;i++)        {   int t=(int)(i*xl-b);//要加的y。             b+=t;//把那个加到b上。             time+=t;//次数             b=b*(i+1)/i;//加x,总价的变化;             //a++;        }        cout<<time<<endl;    }}
0 0
原创粉丝点击