等值数目
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
已知两个整数数组f[]和g[],它们的元素都已经从小到大排列。例如f[]中可能有1,2,2,3,3,g[]中有1,2,2,2,3。 请写一个程序,算出这两个数组彼此之间有多少组相同的数据。就以上例而言:
f[0]于g[0]是第一组;
f[1]于g[1]是第二组;
f[2]于g[2]是第三组;
f[3]于g[4]是第四组。
f[0]于g[0]是第一组;
f[1]于g[1]是第二组;
f[2]于g[2]是第三组;
f[3]于g[4]是第四组。
输入
第一行为两个整数m, n(1≤m, n≤1000),分别代表数组f[], g[]的长度。
第二行有m个元素,为数组f[]。
第三行有n个元素,为数组g[]。
第二行有m个元素,为数组f[]。
第三行有n个元素,为数组g[]。
输出
输出等值数目。
示例输入
5 5 1 2 2 2 3 1 2 2 3 3
示例输出
4
解题报告
本来题目下面提醒写一个o(n+m)的代码,想想以前每次把所有数储存下来再模拟,就很耗时,就试着写一个o(n+m)。写到最后都错了,郁闷。。。
先贴下最常用的方式模拟。。。
#include<stdio.h>
int nn[40000],mm[40000];
int main ()
{
int i,j,n,m,sum=0,l=1;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&nn[i]);
for(i=1;i<=m;i++)
scanf("%d",&mm[i]);
for(i=1;i<=n;i++)
for(j=l;j<=m;j++)
{
if(nn[i]==mm[j])
{
sum++;
l=j+1;
break;
}
}
printf("%d",sum);
return 0;
}
看到网上还有一个小技巧的写法。。。
#include <iostream>
using namespace std;
int main()
{
int m,n;
while(cin>>m>>n)
{
int *f=new int[m],*g=new int[n],i,j,s=0;
for(i=0;i<m;i++)
scanf("%d",&f[i]);
for(i=0;i<n;i++)
{
scanf("%d",&g[i]);
for(j=0;j<m;j++)
{
if(g[i]==f[j])
{
s++;
f[j]=-0xfffffff;
break;
}
}
}
printf("%d\n",s);
}
return 0;
}
小技巧一是用0xfffffff表示不可能的数,以防下次循环再次比较,技巧二就是在输入的同时循环比较。。。
至于o(n+m)的程序,RE了。。。
#include<stdio.h>
#include<string.h>
#define max(x,y) ((x)>(y)?:(x),(y))
#define min(x,y) ((x)<(y)?:(x),(y))
int nn[40000],mm[40000];
int main ()
{
int i,j,n,m,num,max1,max2,min1,min2,sum=0;
scanf("%d%d",&n,&m);
memset(nn,0,sizeof(nn));
memset(mm,0,sizeof(mm));
for(i=0;i<n;i++)
{
scanf("%d",&num);
if(i==0)min1=num;
if(i==n-1)max1=num;
nn[num]++;
}
for(i=0;i<m;i++)
{
scanf("%d",&num);
if(i==0)min2=num;
if(i==n-1)max2=num;
mm[num]++;
}
for(i=max(min1,min2);i<=min(max1,max2);i++)
sum+=(nn[i]>mm[i])?mm[i]:nn[i];
printf("%d",sum);
}
改了全局大小,MLE。。。
再改就WA了。。。
看来写法还是有问题。。。
#include<stdio.h>
#include<string.h>
#define max(x,y) ((x)>(y)?:(x),(y))
#define min(x,y) ((x)<(y)?:(x),(y))
int nn[5000000],mm[5000000];
int main ()
{
int i,j,n,m,num,max1,max2,min1,min2,sum=0;
scanf("%d%d",&n,&m);
memset(nn,0,sizeof(nn));
memset(mm,0,sizeof(mm));
for(i=0;i<n;i++)
{
scanf("%d",&num);
if(i==0)min1=num;
if(i==n-1)max1=num;
nn[num]++;
}
for(i=0;i<m;i++)
{
scanf("%d",&num);
if(i==0)min2=num;
if(i==n-1)max2=num;
mm[num]++;
}
for(i=max(min1,min2);i<=min(max1,max2);i++)
sum+=(nn[i]>mm[i])?mm[i]:nn[i];
printf("%d",sum);
}
先放放吧