題目很有意思,我想說其實我在比賽的時候就看過了一下這個題目,今天才這么快搞出來吧。
其實總共按上鍵的次數不會超過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; }
