18清明校内测试T1

Posted Mystical-W

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18清明校内测试T1相关的知识,希望对你有一定的参考价值。

消失的数字(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);
}


又从学那里得到了一种新的(强无敌的)做法。
我们先输入的数组用sort大法排好序以后就会保持单调递增。
后输入的被擦掉的数也存在一个数组内sort一遍,这样都就保持单调递增了。
那么下面就是最精彩的了让两个数组的下标同时前进(可能比较抽象,但是不要着急)。
为了方便理解直接手动模拟上面那组样例
第一组数排好序后是1 3 5 7 8
第二组是         3 5 8
从第一个开始1!=3,输出1,3 == 3,把第二个数组的下标前进一位(仔细想想正确性)。
5 == 5 第二组的下标再前进一位,7!=8输出7,8 == 8,结束。
怎么样是不是很强大。
代码如下
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n, m;
int a[100005], b[100005];

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

以上是关于18清明校内测试T1的主要内容,如果未能解决你的问题,请参考以下文章

校内模拟测试010T1 删点游戏dt

校内测试总结

校内模拟赛T1大美江湖

2019.7.24 校内测试 分析+题解

8.28校内测试区间DP

2017-9-3 校内模拟T1卡片card