POJ 1032--Parliament

来源:互联网 发布:2017mac和iphone铃声 编辑:程序博客网 时间:2024/05/16 12:51

题意

题目的意思是,有一个会议总共会有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;}
原创粉丝点击