ACM 中wrong answer(WA)的一种处理办法 UVA10474 where is the marble

  题目大意:有N块大理石,每块大理石上有一个非负整数,首先把个数从小到大排序(编号为1-n),然后回答Q个问题,每个问题问大理石上是否有这个数。

ACM 中wrong answer(WA)的一种处理办法 UVA10474 where is the marble_第1张图片


题目没有任何难度,但是我却A了四个小时。。。。长时间没有用输入输出重定向,所以每次提交我的

freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

都没有删除,OJ一直WA,不过正是因为这样,我学会了一种方法。我们都知道,一般出现WA情况是较难找出来错误数据的,如果我们知道我们的程序是运行哪一个数据产生错误时,我们就有针对性去改代码了。下面来介绍这种方法。 先看看我一直WA的代码(程序是没有错的,只是我一直忘记删除输入输出重定向语句)

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    int n, q;
    int Case=0;
    int a[10005], qu[10005];
    while(cin>>n>>q)
    {
        if(n==0&&q==0)
            return 0;
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a, a+n);
        for(int i=0;i<q;i++)
            cin>>qu[i];
        cout<<"CASE# "<<++Case<<":"<<endl;
        for(int i=0;i<q;i++)
        {
            int p=lower_bound(a, a+n, qu[i])-a;
            if(a[p]==qu[i])
                cout<<qu[i]<<" found at "<<p+1<<endl;
            else
                cout<<qu[i]<<" not found"<<endl;
        }
    }
    return 0;
}
我提交后,反馈为WA,我就纳闷了,这样一个题目怎么会WA,我自己试了许多数据,都是对的。最后感觉程序就是没有问题,我又去提交,还是WA。又思考了一会,搞不明白,于是我去网上找了一份AC代码,如下

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
    return *(int *)a - *(int *)b;
}
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output1.txt", "w", stdout);
    int m,n,j,i;
    int a[10005];
    int b[10005];
    int cnt = 0;
    while(scanf("%d%d",&n,&m),n&&m)
    {
        cnt++;
        for(i=1; i<=n; i++)
            scanf("%d",&a[i]);
        for(j=1; j<=m; j++)
            scanf("%d",&b[j]);
        qsort(a+1,n,sizeof(a[0]),cmp);
        printf("CASE# %d:\n",cnt);
        for(i=1; i<=m; i++)
        {
            int flag = 0;
            for(j=1; j<=n; j++)
            {
                if(b[i] == a[j])
                {
                    flag = 1;
                    break;
                }
            }
            if(flag)
            {
                printf("%d found at %d\n",b[i],j);
            }
            else
            {
                printf("%d not found\n",b[i]);
            }
        }
    }
    return 0;
}

我细心的看了看,感觉和我的代码没有区别啊。什么鬼。最后终于决定试数据。要想试数据,首先要数据。我介绍的这种适合一部分题目(输入全部为数的题目)。数据用随机数发生器。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int i;
    freopen("1000.txt", "w", stdout);//要加上这一句,让生成的随机数保存起来,生成的文本在该程序目录下
    srand(time(NULL));//设置随机数种子。

    for(i = 0; i < 1000; i ++)//运行1000次。
        printf("%d\n", rand());//每次获取一个随机数并输出。

    return 0;
}
ACM 中wrong answer(WA)的一种处理办法 UVA10474 where is the marble_第2张图片

看,生成了10000, 8000; 2000, 1000。我心想,有这些数据什么程序bug我测不出来(当我的程序和网上程序输出结果一样的时刻,心中一万只小马呼啸而过)。

接下来复制粘贴到input就可以了。要与程序输出对应哈ACM 中wrong answer(WA)的一种处理办法 UVA10474 where is the marble_第3张图片

我的代码和网上代码编译运行后的输出结果分别在output和output1中。可是怎么比较呢?拿到人工去比较输出。。。当然不是。我们要用文件比较工具。我推荐Beyond compare。

比较结果如下

ACM 中wrong answer(WA)的一种处理办法 UVA10474 where is the marble_第4张图片

呵呵呵,将近一万条数据也没有一个和AC代码输出结果不一样的再见再见再见,心真的好累,不过这也是程序设计的乐趣之一啊。这里说几句题外话,我正式开始刷题是寒假快结束时才开始的,但我大一一开学是知道有ACM这项赛事的,我是科协ACM组的。后来军训结束后我想要不要搞ACM呢?我总感觉我没有任何电脑基础假如一开始就一心扑在ACM上并不好,ACM有助于锻炼我们程序设计内力不错,但也不见得不搞ACM就成不了大牛。软件行业那么多分支,不体会一下怎么知道自己到底喜欢什么。于是大一上学期我定了个目标,要尽可能的了解各项技术,至少要让某项技术让我听着不会感觉特别高大上。于是我了解了Linux(搞定了许多命令行,这正是因为有这个基础,所以比较适应gdb调试),学了单片机(了解到键盘扫描程序,个人感觉没有人带着入门太难,没接触单片机前我以为VC,CB就能写单片机程序,我还是太天真),选修了数据库(sqlserver装的心好累。。。),通过Java了解了面向对象(现在真在默默自学Java,毕竟现在主流)。其实我一直想编个APP玩,但是当时Java就看到了继承,呵呵哒。最后用5,6天时间弄好了Android studio,弄成了第一个APP(点击图标后显示我的名字,忽然感觉开发APP也不是那么神秘了),呃呃连代码都不用写,修改几下创建时内容就可以了,最后加工了下,把图标换成了我妹妹的照片。基本大一上蛮充实的,毕竟人也不太善于交往,学期最后几天看了我下铺班长领的社会保障卡才算认识了我们专业的二十几位女生,感觉程序员真的挺适合我的。虽然学的太杂,不过我的目标也是这个,尽可能先了解,再去确定大学期间专攻哪个方向。寒假放了33天,只有八天没练车再见,不过一寒假练过科二,科三,科四直接拿驾照得意,大学毕业我就是老司机了微笑。寒假最后几天还是确定了刷OJ题,毕竟大学还是打基础,虽然刷OJ题没有项目锻炼编程能力,但是可以提高我们的思维能力。

大一很快就会过去了,该努力了。一起加油吧,本人没什么大志向,虽然很想进A协参加比赛拿奖,但这个感觉有点梦幻啊。即使刷题拿不了奖,而且有的时候会被折磨的很痛苦,但这就像是基础,多做做题还是很好地。



你可能感兴趣的:(ACM,uva)