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