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 
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);
}


你可能感兴趣的:(夯实基础,codeforces,数学,贪心)