码迷,mamicode.com
首页 > 其他好文 > 详细

18清明校内测试T1

时间:2018-04-07 21:08:08      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:space   cstring   nbsp   for   映射   print   i++   ati   必须   

消失的数字(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<=109


 

因为百分之百的数据ai,bi<=10,所以我们可以想到用C++的STL的容器可以过(数组肯定是不行的)。

当然可以用map也可以用set。不过今天只说map。

map的特性是满足一个映射的关系。

而10的9次方还在int范围内(2147483647),所以定义一个map<int, int>M;就够了。

第一个int是给s[i]开辟的,存的是输入的数,第二个int对应的是有几个这样的数,注意一定要用int形,因为有可能有一样的数字。

这样进行完操作后就可以按照降序输出了(桶排序有没有)。

双脚捧上我的AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>

using namespace std;

int s[100005];
int n, m;
map<int, int> M;

int main() {
    freopen("number.in", "r", stdin);
    freopen("number.out", "w", stdout);
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        scanf("%d", &s[i]);
        M[s[i]]++;
    }
    scanf("%d", &m);
    for(int i=1; i<=m; i++) {
        int a;
        scanf("%d", &a);
        M[a]--;
    }
    for(int i=1; i<=n; i++) {
        while(M[s[i]]) {
            printf("%d ", s[i]);
            M[s[i]]--;
        }
    }
    fclose(stdin);
    fclose(stdout);
}
作者:wlz
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

18清明校内测试T1

标签:space   cstring   nbsp   for   映射   print   i++   ati   必须   

原文地址:https://www.cnblogs.com/bljfy/p/8734482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!