大致题意:
有n罐果酱,每个盒子至多装k罐,盒子个数不限,现令n罐果酱装进这些盒子中,问:包含最少果酱的盒子中,最多能有多少罐果酱?
1<=n,k<=10^18.
我们先令每个盒子尽可能装满,求得使用了a个满盒子,1个半满盒子;记半满盒子里有b罐果酱。
则n/k=a,n%k=b.
如果b=0,那么k本身即是答案;
如果b!=0,则满的盒子一定会向半满的盒子给出果酱,不妨令所有满盒子给出的果酱数相同。
设给出x罐果酱时,原满盒子恰大于等于原半满盒子的果酱数。
x满足k-x>=b+a*x
整理得 x<=(k-b)/(a+1);ans=min(k-x,b+a*x).
多给一个需额外求一下给出x+1罐果酱时的答案,取较大者输出。
#include<bits/stdc++.h> using namespace std; long long minmy(long long a,long long b) { return a>b ? b : a; } long long maxmy(long long a,long long b) { return a>b ? a : b; } int main() { long long n,k; long long a,b; cin>>n>>k; a=n/k,b=n%k; if(b==0) {cout<<k;return 0;} long long x=(k-b)/(a+1); long long ans=minmy(k-x,b+a*x); ++x; ans=maxmy(ans,minmy(k-x,b+a*x)); cout<<ans; return 0; }