在公交车站前排队的朋友有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
只要。
我可以采用的任何其他方法吗?
谢谢!
答案 0 :(得分:0)
我可以想到以下简单的解决方案(因为您目前关注的是正确性而非时间复杂性):