| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 946 人关注过本帖
标题:Hdu2034 求大神帮忙看看 为啥一直WA
只看楼主 加入收藏
vongola1998
Rank: 1
来 自:上海
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-2-8
结帖率:66.67%
收藏
 问题点数:0 回复次数:6 
Hdu2034 求大神帮忙看看 为啥一直WA
如题 自己输入数据运行后没问题 但放hdu里就一直WA
题目链接 http://acm.hdu.
#include<stdio.h>
int main()
{
    int n,m,a[100],b[100];
    while(scanf("%d%d",&n,&m) && n||m)
    {
        int i,j,k;
        for(i=0;i<n;i++) scanf("%d",&a[i]);
        for(i=0;i<m;i++) scanf("%d",&b[i]);
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(a[i]==b[j])
                {
                    for(k=i;k<n;k++)
                    {
                        a[k]=a[k+1]; //用后一个元素去覆盖前一个元素,完成“删除”动作
                    }
                    n--;
                    i--;
                }
            }
        }
        if(n==0)
        {
            printf("NULL\n");
            continue;
        }
        for(i=0;i<n-1;i++) //排序
        {
            int baseMIN=i;
            for(j=i;j<n;j++)
            {
                if(a[j]<a[baseMIN]) baseMIN=j;
            }
            int temp=a[i];a[i]=a[baseMIN];a[baseMIN]=temp;
        }   
        
        for(i=0;i<n;i++)
        {
            printf("%d ",a[i]);
            if(i==n-1) printf("\n");
        }
    }
    return 0;
}

2017-02-08 00:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
&&的优先级高于||,所以 while(scanf("%d%d",&n,&m) && n||m) 等同于 while( (scanf("%d%d",&n,&m) && n) || m ),虽然不影响AC,但明显是个错误。

----------------------------------------

for(k=i;k<n;k++)
{
    a[k]=a[k+1];
}
也不对吧,若 k 等于 n-1,那 a[k+1] 就越界了。

----------------------------------------

for(i=0;i<n;i++)
{
    for(j=0;j<m;j++)
    {
        if(a[i]==b[j])
        {
            for(k=i;k<n;k++)
            {
                a[k]=a[k+1];
            }
            n--;
            i--; // 这里逻辑也不对吧,若之前i等于0,那i--之后,i就是-1,a[i]越界了
                 // 除非你在这里加个 break;
        }
    }
}

----------------------------------------

"排序" 那段我就不看了,你自己检查

----------------------------------------

for(i=0;i<n;i++)
{
    printf("%d ",a[i]);
    if(i==n-1) printf("\n");
}
没什么错误,只是奇怪为什么不写成
for(i=0;i<n;i++)
    printf("%d ",a[i]);
printf("\n");
2017-02-08 08:41
vongola1998
Rank: 1
来 自:上海
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-2-8
收藏
得分:0 
回复 2楼 rjsp
感谢大神!
2017-02-08 11:59
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
这题有点变态,必须排序才能ac,。其实只需要用一个数组表示a集合,b集合在输入时就使用,用完即扔掉,代码如下:
程序代码:
#include<stdio.h>
void main()
{
    int n,m,i,j,a[101],b;
    while(scanf("%d%d",&n,&m),n|m)
    {
        for(i=0;i<n;i++)scanf("%d",&a[i]);
        while(m--)
        {
            scanf("%d",&b);
            for(i=0;i<n;i++)
            {
                if(a[i]==b)
                {
                    for(j=i;j<n;j++)a[j]=a[j+1];
                    n--;
                    break;
                }
            }
        }
        if(n)
        {
            for(i=0;i<n-1;i++)
            {
                for(j=i+1;j<n;j++)
                {
                    if(a[i]>a[j])
                    {
                        b=a[i];
                        a[i]=a[j];
                        a[j]=b;
                    }
                }
            }
            for(i=0;i<n;i++)printf("%d ",a[i]);
        }
        else printf("NULL");
        printf("\n");
    }
}
2017-02-08 15:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
以下是引用xzlxzlxzl在2017-2-8 15:01:37的发言:

这题有点变态,必须排序才能ac,。其实只需要用一个数组表示a集合,b集合在输入时就使用,用完即扔掉,代码如下:
效率仍然低呀
应该 a先排序,b先排序,然后遍历一次就行了
2017-02-08 15:20
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
以下是引用rjsp在2017-2-8 15:20:11的发言:

效率仍然低呀
应该 a先排序,b先排序,然后遍历一次就行了

我认为不需要排序也能得到正确的结果的,结果不能ac,后来对结果做一次冒泡排序就ac了。我没有b集合,无法对b集合排序。
如果非要涉及效率,还是要b集合,遍历一次应该还是不行吧,我只能想到a集合的单个元素相对b集合元素的比较位置递增,甚至还要判断集合的包含、交叉等情况,也许能提高效率,但逻辑好复杂哟!不知rjsp版主怎么做到一次遍历解决的,还望不吝赐教!
2017-02-08 16:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 6楼 xzlxzlxzl
先将a排序,b排序
然后遍历a集合
{
    如果 *pa == *pb 则 ++pa, ++pb
    如果 *pa < *pb 则 输出*pa,++pa
    如果 *pa > *pb
        如果 pb不是指向b的最后一个元素,则 ++pb
        否则 输出*pa, ++pa
}
收到的鲜花
  • xzlxzlxzl2017-02-08 19:12 送鲜花  20朵   附言:thanks
2017-02-08 16:21
快速回复:Hdu2034 求大神帮忙看看 为啥一直WA
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017687 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved