程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4803 Poor Warehouse Keeper(貪心+數學)

hdu 4803 Poor Warehouse Keeper(貪心+數學)

編輯:C++入門知識

題目鏈接:hdu 4803 Poor Warehouse Keeper

題目大意:有以個屏幕可以顯示兩個值,一個是數量x,一個是總價y。有兩種操作,一種是加一次總價,變成x,x+y;一種是加一個數量,這要的話總價也會相應加上一個的價錢,變成x+1,y+y/x。總價顯示的為取整後的整數,小數部分忽略。給定一個目標x,y,初始狀態為1,1,求最少需要多少次可以目標狀態,不可以達到的話輸出-1.

解題思路:如果是加一次總價的話,單價就在變大;如果是加一次數量的話,單價是不變的。總而言之,單價是只會往上漲,而不會往下降的。
然後物品的數量也必須從1變成x,也就是說至少要加x-1次單價才可以,那麼如果單價過大s,s?(x?1)≥y+1肯定是不予許的。所以對於每一個i(數量)來說,單價都有一個上限值,以保證說在增加數量的時候不會導致總價溢出。
設當前數量為i,臨界總價為t,那麼就有
y+1>t?xi
t<(y+1)?ix

    即,每次對於一個數量,盡量加總價,使得單價盡量大,並且保證在和面加數量時不會大於上限,因為單價大的話,加一次數量總價接近目標值的速度會更快。
#include 
#include 
#include 

const double eps = 1e-9;

int main () {
    double x, y;

    while (scanf("%lf%lf", &x, &y) == 2) {

        if (x > y) {
            printf("-1\n");
            continue;
        }

        double k = (y+1-eps) / x;
        int cnt = (int)x - 1;

        double tmp = 1;
        for (int i = 1; i <= (int)x; i++) {
            double t = i * k;
            int u = (int)(t-tmp);
            tmp += u;

            tmp = tmp * (i+1) / i;
            cnt += u;
        }
        printf("%d\n", cnt);
    }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved