首页 > 代码库 > 消失的数字(number)

消失的数字(number)

消失的数字(number)

Time Limit:1000ms   Memory Limit:128MB

 

题目描述

rsy拥有n个数,这n个数分别是a1,a2,…,an。

后来出现了一个熊孩子zhw,用橡皮擦去了其中若干个数字,并且打乱了剩下的数字。rsy赶到现场后只剩下了m个数字b1,b2,…,bm,她想知道哪些数字被擦去了。

现在你需要告诉rsy被擦去的n-m个数是什么。

 

 

输入格式(number.in)

    第一行一个数n,第二行n个数ai,表示一开始的数字。

    第三行一个数m,第四行m个数bi,表示被擦去后的数字。

 

输出格式(number.out)

    一行n-m个数,从小到大输出所有被擦去的数字。

 

输入样例

5

1 3 5 7 8

3

3 5 8

 

输出样例

1 7

 

数据范围

对于30%的数据n<=1000,ai与bi都是有序的。

对于60%的数据n<=100000,ai与bi都是有序的。

对于80%的数据n<=100000,ai,bi<=n。

对于100%的数据n<=100000,1<=ai,bi<=10^9。

60分代码

对于这个题,我刚拿到时,一看到数据范围就开始想什么奇怪的算法,因为我认为普通算法会超时,(可是当拿到std时我蒙了,竟然就是那样;)

所以当时就直接奔60分去了;由于不充分理解题意,写了个很2的代码

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<string>
  7 
  8 using namespace std;
  9 
 10 const int N=100001;
 11 
 12 int a[N];
 13 int b[N];
 14 int fa=0;
 15 int fb=0;//是正序 --从小到大 
 16 
 17 int main()
 18 {
 19     freopen("number.in","r",stdin);
 20     freopen("number.out","w",stdout);
 21     int n;
 22     int sh;
 23     scanf("%d",&n);
 24     for(int i=1;i<=n;i++)
 25     {
 26         scanf("%d",&a[i]);
 27     }
 28     scanf("%d",&sh);
 29     for(int i=1;i<=sh;i++)
 30     {
 31         scanf("%d",&b[i]);
 32     }
 33     
 34     if(a[1]>a[2])
 35     {
 36         fa=1;//前面的大 
 37     }
 38     if(b[1]>b[2])
 39     {
 40         fb=1;
 41     } 
 42     if(fa==fb&&fa==0)
 43     {
 44         int js=1;
 45         for(int i=1;i<=n;i++)
 46         {
 47             if(a[i]!=b[js])
 48             {
 49                 printf("%d ",a[i]);
 50             }
 51             else
 52             {
 53                 js++;
 54             }
 55         }
 56         return 0;
 57     }
 58     if(fa==fb&&fa==1)
 59     {
 60         int js=sh;
 61         for(int i=n;i>=1;i--)
 62         {
 63             if(a[i]!=b[js])
 64             {
 65                 printf("%d ",a[i]);
 66             }
 67             else
 68             {
 69                 js--;
 70             }
 71         }
 72         return 0;
 73     }
 74     if(fa==0&&fb==1)
 75     {
 76         int js=sh;
 77         for(int i=1;i<=n;i++)
 78         {
 79             if(a[i]!=b[js])
 80             {
 81                 printf("%d ",a[i]);
 82             }
 83             else
 84             {
 85                 js--;
 86             }
 87         }
 88         return 0;
 89     }
 90     if(fa==1&&fb==0)
 91     {
 92         int js=1;
 93         for(int i=n;i>=1;i--)
 94         {
 95             if(a[i]!=b[js])
 96             {
 97                 printf("%d ",a[i]);
 98             }
 99             else
100             {
101                 js++;
102             }
103         }
104         return 0;
105     }
106 }

ac代码

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,i,X,a[100005],b[100005];
int cmp(int i,int j) {return i<j;}
int main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    scanf("%d",&n);
    for (i=1; i<=n; i++) scanf("%d",&a[i]);
    scanf("%d",&m);
    for (i=1; i<=m; i++) scanf("%d",&b[i]);
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+m+1,cmp); X=1;
    for (i=1; i<=n; i++)
    {
        if (a[i]==b[X]) X++; else printf("%d ",a[i]);
    }
    return 0;

}

很好理解,就不打注释了

可以说水题一道

消失的数字(number)