zoukankan      html  css  js  c++  java
  • 2013ACM/ICPC亚洲区南京站现场赛---Poor Warehouse Keeper(贪心)

    题目链接

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

    Problem Description
    Jenny is a warehouse keeper. He writes down the entry records everyday. The record is shown on a screen, as follow:

    There are only two buttons on the screen. Pressing the button in the first line once increases the number on the first line by 1. The cost per unit remains untouched. For the screen above, after the button in the first line is pressed, the screen will be:

    The exact total price is 7.5, but on the screen, only the integral part 7 is shown.
    Pressing the button in the second line once increases the number on the second line by 1. The number in the first line remains untouched. For the screen above, after the button in the second line is pressed, the screen will be:

    Remember the exact total price is 8.5, but on the screen, only the integral part 8 is shown. 
    A new record will be like the following:

    At that moment, the total price is exact 1.0.
    Jenny expects a final screen in form of:

    Where x and y are previously given.
    What’s the minimal number of pressing of buttons Jenny needs to achieve his goal?
     
     
    Input
    There are several (about 50, 000) test cases, please process till EOF.
    Each test case contains one line with two integers x(1 <= x <= 10) and y(1 <= y <= 109) separated by a single space - the expected number shown on the screen in the end.
     
     
    Output
    For each test case, print the minimal number of pressing of the buttons, or “-1”(without quotes) if there’s no way to achieve his goal.
     
     
    Sample Input
    1 1
    3 8
    9 31
     
     
    Sample Output
    0
    5
    11
     
     
    Hint
    For the second test case, one way to achieve is: (1, 1) -> (1, 2) -> (2, 4) -> (2, 5) -> (3, 7.5) -> (3, 8.5)
     
    Source
     
    Recommend
    liuyiding   |   We have carefully selected several similar problems for you:  5901 5899 5898 5897 5896 
     
     
     
    题意:有一种显示器带有两个按钮,显示器上有两个数 ,显示器只能显示整数,小数部分不显示(实际上是小数,只是小数部分不显示出来),显示器上的的初始数为x=1.0  y=1.0  ,如果按上面一个按钮,第一个数x加一,y变为y=(y/x)*(x+1),  如果按下面一个按钮,x不变,y加一,现在输入两个数,求最小的步数使得1 1 变到这两个数;
     
    思路: (1, 1) -> (1, 2) -> (2, 4) -> (2, 5) -> (3, 7.5) -> (3, 8.5)  分析这个样例,设输入的两个数为x  y  s1=1.0  s2=1.0 我们可以先增加s2值,尽可能的增加s2值,但要保证增加后的s2值满足s2/s1<=y/x  为什么呢? 这样做是为了保证增加s1 的时候不会让s2 大于y  然后增加一次s1,再回到上面的过程增加s2 ...... s1小于10 所以复杂度很低的。 最后要注意一下精度,因为显示器不显示小数部分,所以可以把y加上0.99999999 ;
     
    代码如下:
    #include <iostream>
    #include <algorithm>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
    #include <set>
    #include <queue>
    #include <vector>
    using namespace std;
    const double esp=1e-8;
    
    int main()
    {
        double x,y,s1,s2;
        while(scanf("%lf%lf",&x,&y)!=EOF)
        {
            y+=0.9999999;
            long long sum=0;
            if(x>y) { puts("-1"); continue; }
            s1=1.0; s2=1.0;
            while(1)
            {   if(s1-x+esp>=esp&&s1-(x+1)<esp) break;
                long long t=(long long)(y*s1/x-s2);
                sum+=t;
                s2=s2+t;
    
                s2=s2*(s1+1)/s1;
                s1=s1+1;
                sum++;
                if(s1>=x&&s1-(x+1)<esp) break;
            }
            sum+=(long long)(y-s2);
            printf("%lld
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    根据基本表结构及其数据生成SQL语句
    (转)一个DbHelper数据操作类
    解决AJAX中使用UpdatePanel后再用Response.Write();等无法弹出对话框问题 3法
    今天看到的一些软件工程管理的辅助软件
    编写维护状态的自定义WEB服务器控件
    webBrowser.execWB的完整说明
    [导入]在Web.Config中指定页面的基类
    [导入]一处 ADO.NET Entity Framework 的逻辑BUG
    [导入]在后台代码中引入XAML的方法
    选择排序(java版)
  • 原文地址:https://www.cnblogs.com/chen9510/p/5890520.html
Copyright © 2011-2022 走看看