HDU - 4803 Poor Warehouse Keeper 貪心 + 思維

題意:給出兩種操作:

如果按下按鈕1,會使數量+1,總價對應增長單價數目(因此按下按鈕1不會改變單價)

如果按下按鈕2,會使總價加1,數量不變(按下按鈕2會使單價增加)

現在問至少多少步可以使得   按鈕1數字爲x, 按鈕2數字爲y;

思路:很明顯的貪心思路是先按按鈕2到一定單價,然後按一下按鈕1,重複此步驟直到滿足題意,但是關鍵是按鈕2每次要按多少下,其實這取決於最後的單價,因爲單價只能變大不能變小,因我們每一步操作都要保證單價不能超過最終單價的大小,分析到這,就可以求出每次貪心按y的上限了,要注意的一點就是最終總價只是要顯示出來的是y,並不一定真正是y,但一定不會大於等於 y + 1.

PS:eps 從1e-1到1e-6都能過,再高就會wa

代碼:

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-4;
int main()
{
	double x, y;
	while(~scanf("%lf %lf", &x, &y))
	{
		if(x > y)
		{
			printf("-1\n"); continue;
		}
		int ans = x - 1, delta;
		double one = (y + 1 - eps) / x; // 單價 
		double pre = 1; //上一次y的真實值 
		for(int i = 1; i < x + eps; i++)
		{
			delta = floor(one * i - pre);
			ans += delta;
			pre += delta;
			pre = pre / i * (i + 1); // 按一次x以後的效果 
		}
		printf("%d\n", ans);
	}	
 	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章