1076题分析
[ 本帖最后由 czz5242199 于 2012-11-7 13:40 编辑 ]
此题无关动态规划= =
实际上核心在于求两个数组的交集,如果直接比较也能做到O(n^2)算法,和你上面的动态规划时间复杂度一样,所以是无用的
首先将两个数组排序,然后吻别设置两个变量i=0,j=0,然后比较a[i],b[j],如果相等,则得到一个交集,同时i,j各加一,否则小的那一方加1,因为数组是有序的,所以这样一定可以得到所有的交集,时间复杂度是O(nlogn+mlogm)即排序所用的时间
注意n,m范围都是10w而不是1w
实际上核心在于求两个数组的交集,如果直接比较也能做到O(n^2)算法,和你上面的动态规划时间复杂度一样,所以是无用的
首先将两个数组排序,然后吻别设置两个变量i=0,j=0,然后比较a[i],b[j],如果相等,则得到一个交集,同时i,j各加一,否则小的那一方加1,因为数组是有序的,所以这样一定可以得到所有的交集,时间复杂度是O(nlogn+mlogm)即排序所用的时间
注意n,m范围都是10w而不是1w
程序代码:
#include <iostream> #include <cstdlib> #define Max 100000 using namespace std; int n,m,a[Max],b[Max]; int cmp(const void *a,const void *b) { return *(int*)a-*(int*)b; } int main() { while (cin>>n>>m,n>0 && m>0) { for (int i=0; i<n; i++) cin>>a[i]; for (int i=0; i<m; i++) cin>>b[i]; qsort(a,n,4,cmp); qsort(b,m,4,cmp); int i=0,j=0,ans=0; while (i<n && j<m) { if (a[i]==b[j]) { a[ans++]=a[i]; i++; j++; } else if (a[i]>b[j]) j++; else i++; } if (ans>n/2) cout<<"美丽的女孩,你不适合种田,你适合做ACM!\n"; else if (ans==0) cout<<"有没有女孩子愿意跟我一起回家种田~~\n"; else { cout<<"就是你了,陪我回家种田去吧!\n"<<ans<<endl; for (int i=0; i<ans; i++) cout<<a[i]<<endl; } } }
[ 本帖最后由 czz5242199 于 2012-11-7 13:40 编辑 ]