我正在解决在spoj中计算子序列问题,但得到了错误的答案。这是链接http://www.spoj.com/problems/SUBSEQ/
这是我的代码
#include<stdio.h>
#include<cmath>
#include<algorithm>
int main(){
int t,n;
scanf("%d",&t);
while(t-->0){
scanf("%d",&n);
long arr[n+1];
for(int i=0;i<n;i++){
scanf("%ld",&arr[i]);
}
long sum=arr[0];
int start=0;
long ans=0;
for(int i=1;i<=n;i++){
while(sum>47 && start<i-1){
sum-=arr[start];
start++;
}
if(sum==47)
ans+=1;
if(i<n)
sum+=arr[i];
}
printf("%ld\n",ans);
}
}
请帮我找到错误..
答案 0 :(得分:3)
您的代码将无法通过以下测试用例(至少):
1
4
47 -47 48 -1
您的程序的答案为 1 ,其答案应为 3 ,其中3个序列如下:
47 -47 48 -1 [The entire sequence]
47 [1st element only]
48 -1 [3rd plus 4th elements]
所以,显然,你有错误。
PS :BTW,当你永远不会引用long arr[n+1];
时,为什么要声明一组 n + 1 项:arr[n]
? (实际上该项目甚至不存在)
这个怎么样 - 比你想象的容易: - )
连续扫描数字。对于遇到的每个数字,将其添加到目前为止找到的总和。
保留一张总和(到目前为止)已找到次数的地图。
现在,要总共47,我们需要的是找到一个数字,从目前为止的总和中减去时应该给出数字47.这是必需的,因为如果我们从总和中减去这样的数字那么到目前为止,它会从一些连续数字序列的总和中得到47.
采用上面的例子47 -47 48 -1
使用数字0初始化一个数字为0的地图(也就是说我们到目前为止找到了没有总和一次 - 因为我们正处于开始阶段)
< / LI>从头开始扫描列表,取47号,到目前为止总和,比方说,s = 47.我们做两件事:
下一个号码,-47。到目前为止总和,s = 0
取下一个数字,48,总和到目前为止,s = 48
取最后一个数字-1,到目前为止,s = 47
所以最终答案= 3
对此进行编码应该是相当简单的。