(紀中)2417. Loan Repayment【數學】

(File IO): input:loan.in output:loan.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet


題目描述
FarmerJohnFarmer John 欠了 BessieNBessie N 加侖牛奶1N1012(1≤N≤10^12)。他必須在 KK 天內將牛奶給 BessieBessie。但是,他不想將牛奶太早拿出手。另一方面,他不得不在還債上有所進展,所以他必須每天給 BessieBessie 至少 MM 加侖牛奶1M1012(1≤M≤10^12)
以下是 FarmerJohnFarmer John 決定償還 BessieBessie 的方式。首先他選擇一個正整數 XX。然後他每天都重複以下過程:
(1)假設 FarmerJohnFarmer John 已經給了 BessieGBessie G 加侖,計算 (NG/X(N−G)/X 向下取整。令這個數爲 YY
(2)如果 YY 小於 MM,令 YY 等於 MM
(3)給 BessieYBessie Y 加侖牛奶。
XX 的最大值,使得 FarmerJohnFarmer John 按照上述過程能夠在 KK 天后給 BessieBessie 至少 NN 加侖牛奶 1K1012(1≤K≤10^12)


輸入
輸入僅有一行,包含三個空格分隔的正整數 NKN、KMM,滿足 KM<NK⋅M<N
注意這個問題涉及到的整數規模需要使用 6464 位整數類型(例如,C/C++longlongC/C++ 中的“long long”)

輸出
輸出最大的正整數 XX,使得按照上述過程 FarmerJohnFarmer John 會給 BessieBessie 至少 NN 加侖牛奶。


樣例輸入
10 3 3

樣例輸出
2


數據範圍限制
測試點 131-3 滿足 K105K≤10^5
測試點 4104-10 沒有額外限制。


提示
在這個測試用例中,當 X=2X=2FarmerJohnFarmer John 第一天給Bessie5Bessie 5 加侖,後兩天每天給 BessieM=3Bessie M=3 加侖。


解題思路
首先一定是二分xx,不必多說但是如果真的一天天掃過去,每次check()check()O(k)O(k)的,明顯超時,所以在check()check()時會使用類似除法分塊的方法。假設現在剩下了rr的欠債,還剩t天
循環退出條件:r0t==0r⩽0∣∣t==0,這時直接通過r0r⩽0的成立與否判斷x的成立與否。。
那麼y=r/xy=⌊ r/x ⌋如果y<=my<=m,那麼直接就以mm爲每天的還債量,於是r=tm,t=0r-=tm,t=0
否則就計算一下會有連續多少天的每日還債量是yy,假設這種情況持續aa天,那麼可以知道在a1a-1天之後的還債量=y=y,而aa天之後的還債量<y<y
在這裏插入圖片描述


代碼

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
long long n,k,m,l,r,mid;
bool check(long long x)
{
    long long kk=k,nn=n;
    while(1)
    {
        long long y,yy;
        y=nn/x;
        if(y<m)
            return m*kk>=nn;
        yy=nn/y-x+1;
        if(yy>kk)
            yy=kk;
        nn-=yy*y;
        kk-=yy;
        if(nn<=0)return 1;
        if(kk==0)return 0;
    }
}
int main(){
	freopen("loan.in","r",stdin);
	freopen("loan.out","w",stdout);
	scanf("%lld%lld%lld",&n,&k,&m);
    l=1,r=n;
    while(l<r)
    {
        mid=(l+r+1)/2;
        if(check(mid))
            l=mid;
        else
            r=mid-1;
    }    
    printf("%lld",l);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章