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<=109 ,所以我们可以想到用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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Mystical-W
来源:http://www.cnblogs.com/bljfy
说明:客官~~您如果觉得写得好的话,记得给我点赞哦。如果要转载的请在合适的地方注明出处。谢
谢您的合作。您要是有什么有疑问的地方可以在下面给我评论。也可以直接私信我哦
声明:本作品由Mystical-W采用知识共享署名-非商业性使用-禁止演绎 4.0 国
际许可协议进行许可
来源:http://www.cnblogs.com/bljfy
说明:客官~~您如果觉得写得好的话,记得给我点赞哦。如果要转载的请在合适的地方注明出处。谢
谢您的合作。您要是有什么有疑问的地方可以在下面给我评论。也可以直接私信我哦
声明:本作品由Mystical-W采用知识共享署名-非商业性使用-禁止演绎 4.0 国
际许可协议进行许可