題目大意:有以個屏幕可以顯示兩個值,一個是數量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;
}