POJ 1032--Parliament

题意

题目的意思是,有一个会议总共会有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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值