| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2181 人关注过本帖
标题:丢失的数字:新手求大神指教啊啊啊!运行正确,但是提交就错了
只看楼主 加入收藏
xuyinhao
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2016-7-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
丢失的数字:新手求大神指教啊啊啊!运行正确,但是提交就错了
Description
有N个数字是来自一个长度为N+1的连续整数序列,但是给你的并不是有序的,请你帮忙找出来是缺失的那个数字是在序列的两边还是中间



Input
有多组测试数据,每组测试数据包括2行,第一行包括一个整数N(0<N<10000),第二行包括N个整数
以N为0结束


Output
每组测试数据输出结果:
中间缺失输出M,两边缺失输出S



Sample Input
Original Transformed

5
2 3 7 5 6
5
3 4 2 5 6
0
5[EOL] 2[SP]3[SP]7[SP]5[SP]6[EOL] 5[EOL] 3[SP]4[SP]2[SP]5[SP]6[EOL] 0[EOL] [EOF]

Sample Output
Original Transformed

Case 1:
M
Case 2:
S
我的代码如下:
#include<stdio.h>
#include<stdlib.h>
cmp(const void*a,const void*b)
{
    return *(int *)a-*(int *)b;
}

int main()
{
    int n,j=1;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        else
        {

            int a[10020],i;
            for(i=0;i<n;i++)
            scanf("%d",&a[i]);
            qsort(a,n,sizeof(a[0]),cmp);
            for(i=1;i<n;i++)
            {
                if(a[i]!=a[i-1]+1)
                {
                    printf("Case %d:\n",j);
                    printf("M\n");
                    break;
                }
                if(i==n-1)
                {
                  printf("Case %d:\n",j);
                  printf("S\n");
                }
            }
        }
        j++;
    }
    return 0;
}
非常感谢!!!
2016-07-09 16:21
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:7 
没看明白具体想问什么
2016-07-09 21:31
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:7 
不管代码写的怎样,楼主所用方法太繁琐了,对题意完全没有分析,凭直觉想当然的去写,效果肯定不好。试着分析一下:对于连续整数序列假定max为最大,min为最小,n为个数,那么有这样的关系  n=max-min+1,观察这一等式,当从中间抽取一个数时,等式仍成立,若从两端去掉一个数,等式将会变化,根据这一道理,题中只要找出输入数据的最大值和最小值就能判断出缺失的数据是在中间还是两边,本题中输入数据时,就可以查找最大和最小值,可以免去存储数据。
2016-07-09 21:45
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 3楼 jklqwe111
那还不如直接判断中间数是否丢失不是更快。反正两边都是S,只有中间是M。用if……else……就搞定了。
2016-07-10 07:26
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:7 
意思是不是:输入的数列是自然数列就输出S,否则输出M。
2016-07-10 08:26
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
回复 4楼 linlulu001
题目中给出的数据是缺失一个数的序列,但是,是乱序给出,你不知道头尾,如何用比较的方法找到缺失的那个数。
2016-07-10 08:54
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
回复 5楼 吹水佬
就是这个意思,按着这一想法,如果找到了两个极值,如果 最大-最小+1=个数 成立  就为一个序列,
2016-07-10 09:02
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 6楼 jklqwe111
qsort它是排列用的,看代码是从小到大排列。
关键是中间和两边的范围搞不清楚。
顺便说下,楼主说它能正确输出,我看不能正确输出,
题目是说两边输出S,但是看代码只有最后输出S。
#include<stdio.h>
#include<stdlib.h>
cmp(const void*a,const void*b)
{
    return *(int *)a-*(int *)b;
}

int main()
{
    int n,j=1;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        else
        {

            int a[10020],i;
            for(i=0;i<n;i++)
            scanf("%d",&a[i]);
            qsort(a,n,sizeof(a[0]),cmp);
            if((a[1]!=a[0]+1)||(a[n-1]!=a[n-2]+1))
                {
                    printf("Case %d:\n",j);
                    printf("M\n");
                }
            else
                {
                    printf("Case %d:\n",j);
                    printf("S\n");
                }
            /*for(i=1;i<n;i++)
            {
                if(a[i]!=a[i-1]+1)
                {
                    printf("Case %d:\n",j);
                    printf("M\n");
                    break;
                }
                if(i==n-1)    //从这里推出中间范围是除首尾外。
                {
                  printf("Case %d:\n",j);
                  printf("S\n");
                }
            }*/
        }
        j++;
    }
    return 0;
}

[此贴子已经被作者于2016-7-10 09:40编辑过]

2016-07-10 09:02
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
回复 8楼 linlulu001
解决问题方法不是唯一,数据无序 ,就进行排序,然后进行逐一比较得出结果,楼主的程序也是这么做的,这一方法并没有错,我认为是太繁琐,排序既费时又占空间,总之效率太低,直接的后果就是AC不过。
2016-07-10 09:24
xuyinhao
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2016-7-9
收藏
得分:0 
谢谢各位啦
我再好好想想
2016-07-10 10:26
快速回复:丢失的数字:新手求大神指教啊啊啊!运行正确,但是提交就错了
数据加载中...
 
   



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

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