CF965C Solution

题目链接

题解

易得,最后一轮只发给Arkady一人糖时,他获得的糖数最多。观察发现\(D\)的数据范围非常小,因此可以枚举发糖的轮数。设发糖的轮数为\(i\),每次每人发\(x\)颗糖,可列方程:

\[(i-1)k\cdot x+x=n \]

化简后得:

\[x=\frac{n} {(i-1)k+1} \]

但是其中\((i-1)\cdot k\)会爆long long,而\(i\cdot k>n\)时\(x=0\),对答案没有贡献,因此特判\(k>n\div i\)时跳过。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int n,k,m,d,ans=0;
	scanf("%lld%lld%lld%lld",&n,&k,&m,&d);
	for(int i=1;i<=d;i++) 
	{
		if(k>n/i) continue;
		ans=max(ans,min(n/((i-1)*k+1),m)*i); 
	}
	printf("%lld",ans);
	return 0;
}	
上一篇:【二分】数列分段(ybtoj 二分-1-1)


下一篇:前端面试题2