题目链接:http://codeforces.com/problemset/problem/519/B
题意:
给出n,再给出三行,分别是n、n-1、n-2个数,输出每一行比上一行缺失的数字。
总感觉自己的脑回路永远想不到最简单的办法
然后就是,水题也可以学到东西,况且这是我觉得水但是我没AC的题
法一:
思路:下一行少的数字一定是上一行的和与下一行的和之间的差值,没想到。
#include<bits/stdc++.h> using namespace std; typedef long long ll ; const int N=1e5+20; int main() { int n,x; while(cin>>n) { ll sum1=0,sum2=0; for(int i=0;i<n;i++) { cin>>x; sum1+=x; } for(int i=0;i<n-1;i++) { cin>>x; sum1-=x; sum2+=x; } for(int i=0;i<n-2;i++) { cin>>x; sum2-=x; } cout<<sum1<<endl; cout<<sum2<<endl; } return 0; }
法二:
思路:排序后,对每一项进行比较,第一个不在原来位置的就是答案啊
#include<bits/stdc++.h> using namespace std; typedef long long ll ; const int N=1e5+20; int a[N],b[N],c[N]; int main() { int n; while(cin>>n) { for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n-1; i++) cin>>b[i]; for(int i=0; i<n-2; i++) cin>>c[i]; sort(a,a+n); sort(b,b+n-1); sort(c,c+n-2); for(int i=0;i<n;i++) { if(a[i]!=b[i]) { cout<<a[i]<<endl; break; } } for(int i=0;i<n-1;i++) { if(b[i]!=c[i]) { cout<<b[i]<<endl; break; } } } return 0; }
这个代码一直RT,但是我不知道错在哪了
思路:直接标记,存在的话++;
错误代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll ; const int N=1e5+20; ll a[N],b[N],book1[N],book2[N],book3[N]; int main() { int n,x; while(cin>>n) { memset(book1,0,sizeof(book1)); memset(book2,0,sizeof(book2)); memset(book3,0,sizeof(book3)); for(int i=0; i<n; i++) { cin>>a[i]; book1[a[i]]++; } for(int i=0; i<n-1; i++) { cin>>b[i]; book2[b[i]]++; } for(int i=0; i<n; i++) { x=a[i]; if(book1[x]&&!book2[x]) { if(!book2[x]) { cout<<x<<endl; break; } else book2[x]--; } } for(int i=0; i<n-2; i++) { cin>>x; book3[x]++; } for(int i=0; i<n-1; i++) { x=b[i]; if(book2[x]) { if(!book3[x]) { cout<<x<<endl; break; } else book3[x]--; } } } return 0; }