消失的数字(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的代码

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>

using namespace std;

const int N=100001;

int a[N];
int b[N];
int fa=0;
int fb=0;//是正序 --从小到大 

int main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    int n;
    int sh;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    scanf("%d",&sh);
    for(int i=1;i<=sh;i++)scanf("%d",&b[i]);
    if(a[1]>a[2])fa=1;//前面的大 
    if(b[1]>b[2])fb=1;
    if(fa==fb&&fa==0)
    {
        int js=1;
        for(int i=1;i<=n;i++)
            if(a[i]!=b[js])printf("%d ",a[i]);
            else js++;
        return 0;
    }
    if(fa==fb&&fa==1)
    {
        int js=sh;
        for(int i=n;i>=1;i--)
            if(a[i]!=b[js])printf("%d ",a[i]);
            else js--;
        return 0;
    }
    if(fa==0&&fb==1)
    {
        int js=sh;
        for(int i=1;i<=n;i++)
            if(a[i]!=b[js])printf("%d ",a[i]);
            else js--;
        return 0;
    }
    if(fa==1&&fb==0)
    {
        int js=1;
        for(int i=n;i>=1;i--)
            if(a[i]!=b[js])printf("%d ",a[i]);
            else js++;
        return 0;
    }
}

 

 

 

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;

}

很好理解,就不打注释了

可以说水题一道

posted @ 2017-05-03 21:22  ioioioioioio  阅读(867)  评论(0编辑  收藏  举报