消失的数字(number)
消失的数字(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<=10^9。
60分代码
对于这个题,我刚拿到时,一看到数据范围就开始想什么奇怪的算法,因为我认为普通算法会超时,(可是当拿到std时我蒙了,竟然就是那样;)
所以当时就直接奔60分去了;由于不充分理解题意,写了个很2的代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<string> using namespace std; const int N=100001; int a[N]; int b[N]; int fa=0; int fb=0;//是正序 --从小到大 int main() { freopen("number.in","r",stdin); freopen("number.out","w",stdout); int n; int sh; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); scanf("%d",&sh); for(int i=1;i<=sh;i++)scanf("%d",&b[i]); if(a[1]>a[2])fa=1;//前面的大 if(b[1]>b[2])fb=1; if(fa==fb&&fa==0) { int js=1; for(int i=1;i<=n;i++) if(a[i]!=b[js])printf("%d ",a[i]); else js++; return 0; } if(fa==fb&&fa==1) { int js=sh; for(int i=n;i>=1;i--) if(a[i]!=b[js])printf("%d ",a[i]); else js--; return 0; } if(fa==0&&fb==1) { int js=sh; for(int i=1;i<=n;i++) if(a[i]!=b[js])printf("%d ",a[i]); else js--; return 0; } if(fa==1&&fb==0) { int js=1; for(int i=n;i>=1;i--) if(a[i]!=b[js])printf("%d ",a[i]); else js++; return 0; } }
ac代码
#include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; int n,m,i,X,a[100005],b[100005]; int cmp(int i,int j) {return i<j;} int main() { freopen("number.in","r",stdin); freopen("number.out","w",stdout); scanf("%d",&n); for (i=1; i<=n; i++) scanf("%d",&a[i]); scanf("%d",&m); for (i=1; i<=m; i++) scanf("%d",&b[i]); sort(a+1,a+n+1,cmp); sort(b+1,b+m+1,cmp); X=1; for (i=1; i<=n; i++) { if (a[i]==b[X]) X++; else printf("%d ",a[i]); } return 0; }
很好理解,就不打注释了
可以说水题一道