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。

显然按下A板按钮使得B板数值成比例增加,比值为p,按下B板数值使得比例增加。

比例增加过程不可逆,状态不可达当且仅当a1 < b1。

首先从A板数组从1增加到a1至少需要a1 - 1次操作,这与B板的状态无关。

而A板的数值变化会引起B板成倍增加,考虑到f(i) = (i + 1) / i是严格递减函数。

直观上我们有应该尽可能把按A板的操作提前,这样B板上的数值就会尽快接近目标值。

注意到比值p<(b + 1) / a,我们尽可能向该值靠近,从1开始。

然后随着A板数值增大,逐步逼近该值,记录下B板的操作次数,即可解决此题。

浮点数执行近似运算,导致误差,本题用分数表示有理数(比值)。

acm.hdu.edu.cn/showproblem.php?pid=4803
 
 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4
 5 using namespace std;
 6 typedef __int64 LL;
 7
 8 LL a, b;
 9
10 LL gcd(LL a, LL b){
11     if(!b) return a;
12     return gcd(b, a % b);
13 }
14
15 void solve(){
16     if(b < a){
17         printf("-1\n");
18         return;
19     }
20     LL lhs = 1, rhs = 1;
21     //rhs :: denominator
22     //lhs :: numerator
23     LL cnt = a - 1;
24     //operations required for A
25     for(int i = 1; i <= a; i++){
26         LL f = (b + 1) * i * lhs - a * rhs, g = a * lhs;
27         LL k = (f % g == 0 ? f / g - 1 : f / g);
28         cnt += k;
29         //extra operations required for B
30         rhs += k * lhs;
31         LL GCD = gcd((i + 1) * rhs, i * lhs);
32         rhs = rhs * (i + 1) / GCD;
33         lhs = lhs * i /GCD;
34     }
35     printf("%I64d\n", cnt);
36 }
37
38 int main(){
39     while(~scanf("%I64d%I64d", &a, &b)){
40         solve();
41     }
42     return 0;
43 }

时间: 2024-10-10 03:41:46

hdu4803 Poor Warehouse Keeper的相关文章

【贪心】hdu4803 Poor Warehouse Keeper

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

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("%

BNUOJ 34025 -Poor Warehouse Keeper(贪心)

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

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. 解题思路:如果是加一次总价的话,单价就在变大:如果是加一次数量的话,单价是不变的.总而言之,单价是只会往上

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 数学+贪心

#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取整) 如果不行输出

HDU 4803 Poor Warehouse Keeper

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4803 解题报告:有一个记录器,一共有两个按钮,还有两行屏幕显示,第一行的屏幕显示的是数目,第二行的屏幕显示的是总价,按第一行的按钮表示单价不变,数量加1,同时第二行的总价会根据当前的单价进行相应的增加,然后按一下第二行的按钮表示数量不变,总价加1,这样的话单价就变大了.现在给出这个屏幕上显示的初始的第一行的是1,第二行的是1,然后再给出结束的时候第一行是x,第二行是y,让你求要从初始的变成最后的至少

ZOJ 2601 Warehouse Keeper(费用流)

ZOJ 2601 Warehouse Keeper The company where Jerry works owns a number of warehouses that can be used to store various goods. For each warehouse the types of goods that can be stored in this warehouse are known. To avoid problems with taxes, each ware

13南京区域赛现场赛 题目重演 解题报告

A.GPA(HDU4802): 纯属进入状态用,给你一些字符串对应的权重,求加权平均,如果是N,P不计入统计 GPA Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1193    Accepted Submission(s): 743 Problem Description In college, a student may take