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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    objc_setAssociatedObject 使用(转)
    UIWebView加上safari风格前进后退按钮(转)
    解决 ios7.0 以后自定义导航栏左边按钮靠右的问题
    iOS开发中邮箱,电话号码,身份证,密码,昵称正则表达式验证
    利用openURL,在IOS应用中打开另外一个应用
    点击按钮打开文件
    CString的中文显示乱码的解决办法
    Unicode字符集和多字节字符集关系(转载)
    MFC基础--C++中的字符集(转自MSDN)http://msdn.microsoft.com/zh-cn/library/06b9yaeb(v=vs.90).
    MFC基础--CString的Tokenize()和_tcstok()的用法对比
  • 原文地址:https://www.cnblogs.com/bljfy/p/8734482.html
Copyright © 2011-2022 走看看