zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    1062 Talent and Virtue (25 分)
    1083 List Grades (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1121 Damn Single (25 分)
    1120 Friend Numbers (20 分)
    1084 Broken Keyboard (20 分)
    1092 To Buy or Not to Buy (20 分)
    数组与链表
    二叉树
    时间复杂度与空间复杂度
  • 原文地址:https://www.cnblogs.com/bljfy/p/8734482.html
Copyright © 2011-2022 走看看