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

来源:互联网 发布:ipadair下载不了软件 编辑:程序博客网 时间:2024/04/26 19:03

最大值:
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);}


0 0