题目链接:
题意:给出N个糖果, K个小朋友, 每个小朋友最多获得D次糖果, 每回合一个小朋友获得X个糖果(X<=M), 当糖果少于X个时候直接丢弃, 问第一个小朋友获得糖果的最大值为多少? (N,K,M<=1E18, D <= min(n, 1000))
题解:很明显我们只能枚举第一个小朋友获得i次糖果, 然后列出方程。
因为进行了i回合 (i-1)回合所有的小朋友获得的糖果加上第i回合第一个小朋友获得的糖果必须小于等于n,列出方程
(i - 1) * x * k + x <= n
又因为此时枚举第一个小朋友获得了i次,不能获得i+1次,所以i * k * x + x > n
且x <= M.
注意向上向下取整的问题。
#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
int main()
{
ll n, k, M, D;
scanf("%lld %lld %lld %lld", &n, &k, &M, &D);
ll res = 0;
/********** 1:x * (i - 1) * k + x <= n;
2:x * d * k + x > n
3:x <= M
***********/
for(ll i = 1;i <= min(n, D) && (i - 1) * k + 1 <= n;i ++) {
ll R = n / ( (i - 1) * k + 1 );
ll L = ceil(n / (i * 1.0 * k + 1));
R = min(R, M);
if(R >= L) res = max(res, R * i);
}
printf("%lld\n", res);
return 0;
}