HDU4803_Poor Warehouse Keeper


題目很有意思,我想說其實我在比賽的時候就看過了一下這個題目,今天才這么快搞出來吧。

其實總共按上鍵的次數不會超過10個,我們可以每次假設相隔按兩次上鍵之間按了xi次下鍵,由於上鍵的次數是確定的,所以最后就是求下鍵的次數和最小。

同時用一個等式表達出來后我們就可以發現其實是一個sigama(xi*(n/i))=y-x+1-eps(eps是為了防止后面的數字恰等於1),求sigama(xi)的和最小。

顯然,這里很簡單了,由於系數是從大到小的,我們可以直接從大的開始填充,直到填充的剩余那個數在1的范圍以內就可以了。

注意這里一定要考慮精度問題。。。

居然一開始用cin給T掉了,我看只有兩個數輸入啊,神坑啊。

 

#include <cstdio> #include <cmath>
#define eps 1e-5
using namespace std; double a[15],x,y; int ans,n; int main() { while (scanf("%lf%lf",&x,&y)!=EOF) { ans=(int)(x-1); y-=x-1+eps;
        if (y<0) { printf("-1\n"); continue; } for (int i=1; i<=x; i++) a[i]=x/i; for (int i=1; i<=x; i++) {
            n=(int)(y/a[i]);
            ans+=n; y-=n*a[i]; if (y<1) break;
 } printf("%d\n",ans);
 } return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM