题意
题目的意思是,有一个会议总共会有N个代表参加,这些代表将会被分成n个小组。每天的会议需要每个小组选派1人参加,并且参加会议人员的组合每天都不一样。求要使得这个会议尽可能开得久一点,那么这N个代表应该怎么分组。
分析
假定最后的分组是N = A1 + A2 + .. + An,那么会议的最长时间就变为T = A1 * A2 * … * An。所以这题的意思就是,和为定值的情况下,如何使若干个数的积最大。
由于
1 * A2 * A3 * …* An < (A2+1) * A3 * … An。
很明显的是不能有一个人的小组。
另外
a+b+c=s, 在a,b,c > 1的时候,a * b * c >= a * (b + c),
因此为了积最大,需要所分的组尽可能的多。
我们假定人数最少的一个组A1人数为2,而且之后的每个组均比前面一个组多一个人,那么n个组的情况是Tn = A1 * (A1 + 1) * (A1 + 2) * … * (A1 + n - 1) ,此时可能还剩下m(0 < m < A1 + n)个人。
所以需要将这些人分配给A1到An,而此时显然只能在往后面m个组每个组添加1个人。
代码如下:
Memory: 244K Time: 0MS Length: 15LINES
#include<iostream>
using namespace std;
inline int fun(int x) { return x * (x + 1) / 2 - 1; }
int main()
{
int N = 0;
cin >> N;
int mul = 0;
int i = 2;
for (; N - fun(i) > i; ++i);
int remain = N - fun(i);
for (int k = 2; k < i + 1; ++k)
cout << (k > i - remain ? ((k == remain && k == i) ? k + 2 : k + 1) : k) << " ";
return 0;
}