SUBSEQ中的错误答案

时间:2014-02-04 07:33:59

标签: c++ algorithm

我正在解决在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);
}

}

请帮我找到错误..

1 个答案:

答案 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] ? (实际上该项目甚至不存在)

[编辑]#:添加上述用例的说明

这个怎么样 - 比你想象的容易: - )

  1. 连续扫描数字。对于遇到的每个数字,将其添加到目前为止找到的总和。

  2. 保留一张总和(到目前为止)已找到次数的地图。

  3. 现在,要总共47,我们需要的是找到一个数字,从目前为止的总和中减去时应该给出数字47.这是必需的,因为如果我们从总和中减去这样的数字那么到目前为止,它会从一些连续数字序列的总和中得到47.

  4. 采用上面的例子47 -47 48 -1

    1. 使用数字0初始化一个数字为0的地图(也就是说我们到目前为止找到了没有总和一次 - 因为我们正处于开始阶段)

      < / LI>
    2. 从头开始扫描列表,取47号,到目前为止总和,比方说,s = 47.我们做两件事:

      • map(47)= 1(因为我们发现到目前为止总和= 47第一次)。
      • 现在,我们需要找到次数,我们可以找到s-47 = 0(即1)。所以,回答到目前为止= map(0)= 1
    3. 下一个号码,-47。到目前为止总和,s = 0

        到目前为止,
      • map(0)= 1,因此没有map(0)变为= 2
      • 我们需要找到s-47 = -47的出现次数。哪个= 0.所以答案到目前为止=答案到目前为止+ 0(保持= 1)
    4. 取下一个数字,48,总和到目前为止,s = 48

      • map(48)= 1
      • 我们需要找到s-48 = -1的出现次数。哪个= 0.所以答案到目前为止=答案到目前为止+ 0(保持= 1)
    5. 取最后一个数字-1,到目前为止,s = 47

      • map(47)= 1(在步骤2.1中),所以现在map(47)变为= 2
      • 我们需要找到s-47 = 0的出现次数。其中= 2(在步骤3.1中)。所以回答到目前为止=回答到目前为止+ 2 = 3
    6. 所以最终答案= 3

      对此进行编码应该是相当简单的。