【发布时间】:2013-11-01 16:50:45
【问题描述】:
我陷入了一个算法问题。请为以下问题推荐一些有效的算法。
问题是
找出总和可被给定数整除的子数组数。
我的工作
我做了一个算法,复杂度是O(N^2),这里,N = 数组的大小。
我的代码
#include<stdio.h>
using namespace std;
main() {
int N;
int P;
int T;
int val;
long long int count = 0;
long long int answer = 0;
scanf("%d", &T);
//T = 20;
for(int k = 1; k <= T; k++) {
scanf("%d", &N);
scanf("%d", &P);
count = 0;
answer = 0;
for(int i = 0; i < N; i++) {
scanf("%d", &val);
count += val;
workingArray[i] = count;
}
for(int length = 1; length <= N; length++) {
for(int start = 0; start <= (N-length); start++) {
if( start == 0 ) {
if(workingArray[start+length-1]%P == 0) answer++;
}
else if( (workingArray[start+length-1] - workingArray[start-1])%P == 0) answer++;
}
}
printf("Case #%d\n%lld\n", k, answer);
}
return 0;
}
【问题讨论】:
-
你写的代码到底有什么问题?
-
我认为你的解决方案跳过了很多可能的组合......你只在这里检查相邻元素的总和(除非你的问题中定义了“子数组”)
-
@Ashalynd “子数组”通常指的是数组的连续部分(例如 maximum subarray problem)。对于不连续的部分,人们通常谈论一个“子集”(例如subset sum problem)。
-
@Ashalynd 我拿走了所有案例,没有遗漏任何案例。这里,子数组表示连续元素。
-
我明白了,感谢您的澄清。
标签: c++ arrays algorithm math numerical-analysis