题目链接:http://codeforces.com/problemset/problem/478/B
题目意思:有 n 个人,需要将这班人分成 m 个 组,每个组至少含有一个人,同一个组里的人两两可以结交成一个pair,问怎样分配,可以使得 pair 数最少和最多,输出之。
首先最多 pair 数是很容易求出的,就是 m-1 个组里都放 1 个人,然后最后那个组(即第 m组)人数最多,pair数自然最多,答案就是 (n-m+1) * (n-m) / 2。
最少 pair 数,做的时候有一点点思路:就是使得尽可能多的组的人数尽量平均。好像事实证明是正确的,不过最终表达式....改了 n 次 都无果,最后大数据卡住无从下手,又做了些无节操的事~~~学会就好,学会就好,呵呵呵~~~。
61ms 4KB
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std; typedef __int64 LL; inline LL get_pair(LL tmp)
{
return (tmp * (tmp-)) >> ;
} int main()
{
LL m, n;
while (scanf("%I64d%I64d", &n, &m) != EOF)
{
LL k = n / m, tk = k + ;
LL r = n % m, l = m - r; // 这四条式子请大家好好体会
LL minans = r * get_pair(tk) + l * get_pair(k); LL maxremain = n - (m-);
LL maxans = get_pair(maxremain); printf("%I64d %I64d\n", minans, maxans);
}
return ;
}
加了些特判,一下子15ms 0KB 了