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 编辑 ]









