Codeforces Round #273(Div2) B. Random Teams 贪心+数学

最大值:
n个人,其中m-1个队中只有一个人,剩下的人都放在一个组里

最小值:每一组的人数尽量平均

证明:最小值:

令第i个team人数为xi, 则所求为.

又: .故
整理得: ,当且仅当时,f取得最小值
所以当n整除m时,f取得最小值.

当n不整除m时,n % m部分有两种选择:

①给其中n % m个team每个team多加一个人;

②其中一只team多加n % m人

令r = n % m;
方案1多出来的pair数为: 
方案2多出来的pair数为:

① - ② = , 由于,故① - ② <= 0,则① <= ②

代码如下:

#include <cstdio>
using namespace std;

int main(){
	long long m, n, min_val, max_val;
	scanf("%I64d %I64d", &n, &m);
	long long tmp = n / m;
	long long rest = n % m;
    min_val = tmp * (tmp - 1) / 2 * m + rest * tmp;
	max_val = (n - m) * (n - m + 1) / 2;
	printf("%I64d %I64d\n", min_val, max_val);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值