如何改进呢?

时间:2014-08-14 07:39:30

标签: c++ algorithm

在公交车站前排队的朋友有n组。第i组由ai men组成。此外,还有一条公交车在路线上工作。总线的大小是x,即它可以同时传输x个人。

当公交车到达公交车站时(总是空着),队列头部的几个小组进入公交车。当然,一群朋友不想分开,所以只有在公共汽车可以容纳整个团体的情况下才会去公交车。另一方面,没有人想要失去他的位置,即群体的顺序永远不会改变。

问题是:如何选择公交车的大小x,使公交车可以运输所有的小组,每当公交车离开公交车站时,公交车上没有空的空间(总数)里面的人等于x)?

输入格式:

第一行包含唯一的整数n(1≤n≤10^ 5)。第二行包含n个空格分隔的整数a1,a2,...,a(1≤ai≤10^ 4)。

输出格式:

按递增顺序打印所有可能的总线大小。

样品:

8
1 2 1 1 1 2 1 3

输出:     3 4 6 12

我制作了这段代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void)
{
    int max=0,sum=0,i,n;
    cin>>n;
    int values[100000];

    for ( i = 0; i < n; i++ )
    {
         cin>>values[i];
         sum = sum + values[i];
        if ( values[i] > max )
            max = values[i];
    }
    int p = 0,j;
    int count = 0;
    vector<int> final;
    for ( i = 0; i < n; i++ )
    {
        p = p + values[i];
        j = 0;
        if ( p >= max && sum%p == 0)
        {
            flag = 0;
            while ( j < n )
            {
                garb = p;
                while (garb!= 0)
                {
                    garb = garb - values[j++];
                    if ( garb < 0 )
                        flag = 1;
                }

            }
            if ( flag == 0 )
            {
                final.push_back(p);
                count++;
            }
        }
     }
        sort(final.begin(),final.end());
        for ( j = 0; j < count; j++ )
        {
            cout<<final[j]<<"\t";   
        }
        return 0;
    }

编辑:我这样做基本上,我正在检查找到的除数是否满足条件,如果在任何时间点,我得到一个负整数与值相差,我用标志来标记它。但是,它现在似乎给了我一个段错误。为什么呢?

我首先计算出所有可能值中的最大值,然后检查它是否是值之和的除数。但是,这种方法对输入不起作用:

10
2 2 1 1 1 1 1 2 1 2

我的输出是     2 7 14 而输出应该是     7 14 只要。 我可以采用的任何其他方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我可以想到以下简单的解决方案(因为您目前关注的是正确性而非时间复杂性):

  1. 计算所有ai的总和(正如您所做的那样)。
  2. 计算所有ai的最大值(正如您所做的那样)。
  3. 找出所有和的因子&gt;最大值(AI)。
  4. 对于每个因素,迭代ai并检查是否满足总线条件。