获得SPOJ smpseq的WA

时间:2015-12-25 12:36:47

标签: c++

以下是问题的链接:man page

我每次都会收到WA,尽管代码适用于我尝试过的所有测试用例

请给我一个提示。我是这个

的初学者

这是我的代码。

#include<iostream>
using namespace std;

int main()
{
    int n, m;
    bool check;
    int cnt=0;
    cin >> n;
    int s[n];
    int c[n];
    for(int i = 0; i < n; i++)
        cin >> s[i];

    cin >> m;
    int q[m];
    for(int i = 0; i < m; i++)
        cin >> q[i];

    for(int i = 0; i < n; i++)
    {
        check = false;
        int j = 0;

            while(q[j] <= s[i])
            {

                if(q[j] == s[i])
                    check = true;
                j++;
            }

            if(check == false)
            {
                c[cnt] = s[i];
                cnt++;
            }

    }

    for(int i = 0; i < cnt; i++)
        cout << c[i] << " ";

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码失败是因为您没有检查j的值是否小于m,您只需继续递增它,直到您达到{{1}的值为止}}。因此,当q[j] <= s[i]j循环中变为m时,您实际上正在访问未分配给您的内存,并且存储了一些垃圾值。由于垃圾值可以是任何值,您最终可能会遗漏while中应添加到q[]的某些值。

因此,您的c[]条件应如下所示::

while

我认为这会给你一个AC。

每次进入while(j < m && q[j] <= s[i]) 循环时,您都会初始化j = 0一些内容,这是无用的。因为在问题中给出了两个序列都被排序,所以考虑序列::

  

S = a,b,c,d。 。 。

     

Q = aa,bb,cc,dd。 。

因此,考虑foraa < a是否如此,在第一次迭代中,bb > a停在j。所以,现在bb来自i bSa > aa(S是排序后的序列),b >= ab > aa好。因此,您不需要在每次迭代开始时初始化j = 0,这将为您节省浪费的计算。您只需在j = 0开头{/ 1}}初始化main

此外,您不需要将结果保存在新数组中,只需打印它,当遇到check == false时,这可以节省一些空间。