HDU 4803 Poor Warehouse Keeper

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4803

解题报告:有一个记录器,一共有两个按钮,还有两行屏幕显示,第一行的屏幕显示的是数目,第二行的屏幕显示的是总价,按第一行的按钮表示单价不变,数量加1,同时第二行的总价会根据当前的单价进行相应的增加,然后按一下第二行的按钮表示数量不变,总价加1,这样的话单价就变大了.现在给出这个屏幕上显示的初始的第一行的是1,第二行的是1,然后再给出结束的时候第一行是x,第二行是y,让你求要从初始的变成最后的至少需要按多少次按钮,如果不能实现,那么输出-1.

很明显,当x <= y时,都是可以实现的.说明单价是大于等于1的,而我现在的单价是1,所以我现在要做的事情就是使得单价增加到现在的这个水平,然后按第二行的按钮可以使单价增加,按第一行的按钮时,单价并没有变化,所以,在整个过程中,我都要保证当前的单价乘以最终的数量的时候总价取整不会超过y,因为单价是不可以降的.有了这个条件,对于一定数量的物品,就可以得到这个数量的物品对应的总价的上限是多少了,所以中间过程只要分成按第一行的按钮还是第二行的,不需要管次数了.还要说的是,这题交C++过不了,交g++才过的.

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const double eps = 1e-6;
 8 int judge(double d)
 9 {
10     return fabs(d - (int)d) < eps;
11 }
12 int main()
13 {
14     int sx,sy;
15     while(scanf("%d%d",&sx,&sy)!=EOF)
16     {
17         if(sx > sy)
18         {
19             printf("-1\n");
20             continue;
21         }
22         int ans = 0;
23         double X = 1,Y = 1,p = (double)(sy + 1) / sx;
24         while(1)
25         {
26             if((int)X >= sx && (int)Y >= sy) break;
27             //getchar();
28             double temp = Y / X;
29             if(temp < p && (int)(sx * ((Y+1) / X)) <= sy)
30             {
31                 int tt;
32                 if(judge(X * p)) tt = (int)(X * p) - 1;
33                 else tt = (int)X * p;
34                 ans += (tt - (int)Y);
35                 Y += (double)(tt - (int)Y);
36             }
37             else
38             {
39                 double t = Y / X;
40                 X += 1;
41                 Y += t;
42                 ans++;
43             }
44         }
45         printf("%d\n",ans);
46     }
47     return 0;
48 }

时间: 2024-12-23 12:56:20

HDU 4803 Poor Warehouse Keeper的相关文章

HDU 4803 Poor Warehouse Keeper(贪心)

http://acm.hdu.edu.cn/showproblem.php?pid=4803 贪心的策略是,每次尽量加价格,加到能满足条件的最大值,然后加一下数量,这样反复直到到达答案. 然后加到满足条件最大值一步不能模拟,可以推一下公式就能直接算出来了 代码: #include <stdio.h> #include <string.h> const double eps = 1e-9; double x, y; int main() { while (~scanf("%

hdu 4803 Poor Warehouse Keeper(贪心+数学)

题目链接:hdu 4803 Poor Warehouse Keeper 题目大意:有以个屏幕可以显示两个值,一个是数量x,一个是总价y.有两种操作,一种是加一次总价,变成x,x+y:一种是加一个数量,这要的话总价也会相应加上一个的价钱,变成x+1,y+y/x.总价显示的为取整后的整数,小数部分忽略.给定一个目标x,y,初始状态为1,1,求最少需要多少次可以目标状态,不可以达到的话输出-1. 解题思路:如果是加一次总价的话,单价就在变大:如果是加一次数量的话,单价是不变的.总而言之,单价是只会往上

BNUOJ 34025 -Poor Warehouse Keeper(贪心)

题目:BNUOJ 34025 -Poor Warehouse Keeper(贪心) 题目大意:有一个商品的信息表,上面是数量,下面是总价,然后旁边各有一个按钮.上面的数量按钮按一下数量就加1,然后价格对应的也要在加上一个当前的单价.下面的按钮按一下的话,就对应的总价加1.初始状态是 1 1,然后给出终点状态,问能否得到.可以的话输出最少要按几次按钮,否则输出-1:总价每次输出都是下取整. 解题思路:如果想要尽快的得到总点状态的值,那么就应该按总价的按钮,因为只有总价变大了,商品对因的单价就上升了

Poor Warehouse Keeper

Poor Warehouse Keeper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1672    Accepted Submission(s): 463 Problem Description Jenny is a warehouse keeper. He writes down the entry records every

hdu4803 Poor Warehouse Keeper

给定两个数字显示板A, B和两个按钮,按下按钮使得其对应数字显示增加1. 另,B显示板只显示其实际值的整数部分.两显示器对应的实际值有一个比值p. 按下A板上的按钮, A板上显示的数增加1到a + 1, p不变,B板上的数字更新为(int)(b * (a + 1) / a). 按下B板上的按钮,A板上上显示的数值不变,B 板加1 到b + 1,p更新为(b + 1) / a. 给定目标状态(a1, b1),问至少经过多少次按下按钮可从初始状态(1, 1)到达该状态. 若不可达输出-1. 显然按下

【HDU4803】Poor Warehouse Keeper 数学+贪心

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43450731"); } 题意: 初始状态为:1个物品,总价为1. 目标状态为:x个物品,总价为y. 操作A:变为x+1,y+y/x.(y不取整) 操作B:变为x,  y+1 问最少多少步可以达成条件?(最后操作结束后对y取整) 如果不行输出

【贪心】hdu4803 Poor Warehouse Keeper

题意:一开始有1个物品,总价是1.你的一次操作可以要么使得物品数量+1,总价加上当前物品的单价.要么可以使得总价+1,物品数量不变.问你最少要几次操作从初始状态到达有x个物品,总价是y的状态.这里的y可以有小数点后的部分,会抹去. 如果x>y,显然无解. 因为不管怎样操作,物品的单价是单调不下降的.所以一个naive的贪心策略是先用第二种操作,将物品提升到最大的可能单价(<(y+1)/x),然后再用第一种操作操作到不能再操作为止,剩余的部分用第二种补齐.然而这是不对的. 我们发现,第一种操作,

hdu 4956 Poor Hanamichi BestCoder Round #5(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956 Poor Hanamichi Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7    Accepted Submission(s): 4 Problem Description Hanamichi is taking part in

HDU 4956 Poor Hanamichi

HDU 4956 Poor Hanamichi 题目链接 思路:直接从l往上找判断即可 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; int t; ll l, r; bool judge(ll num) { ll flag = 1; ll ans = 0; whi