有n组朋友在公共汽车站前排队等候。第i组由艾曼组成。另外,这条路线上只有一辆公交车。这辆公共汽车的大小是x,也就是说它可以同时运送x个人。
当公交车到达公共汽车站时(它总是空着的),排在队头的几组人进入公交车。当然,一群朋友不想分开,所以只有在公交车可以容纳整个群体的情况下,他们才会去公交车。另一方面,没有人愿意丢掉自己的位置,那就是群体的顺序永远不会改变。
问题是:如何选择公交车的大小x,使得公交车可以运送所有的群体,并且每次当公交车离开汽车站时,公交车内没有空位(车内的总人数等于x)?
输入格式:
第一行包含唯一的整数n (1≤n≤10^5)。第二行包含n个空格分隔的整数a1、a2、…,an (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;
}编辑:我这样做了,基本上,我检查找到的除数是否满足条件,如果在任何时间点,我得到一个负整数与值的差,我用一个标志来标记它。然而,它现在似乎给了我一个seg故障。为什么?
首先,我从所有可能的值中计算出最大值,然后,我检查它是否是值之和的除数。但是,这种方法不适用于输入,因为:
10
2 2 1 1 1 1 1 2 1 2我的输出是2 7 14,而输出应该只是7 14。还有没有其他我可以用的方法呢?
谢谢!
发布于 2014-08-14 15:59:40
我可以想到以下简单的解决方案(因为你现在关心的是正确性,而不是时间复杂性):
https://stackoverflow.com/questions/25302532
复制相似问题