CCF CSP 2020-6-2 稀疏向量 C语言100分 稀疏向量 完成时间11-16 16:51 代码长度569B C 正确 100分 耗时187ms 空间使用9.964MB
这个代码运行错误,只得了60分,但我感觉这个思路挺好的,不知道有没有大神可以简化一下。 思路:把稀疏向量直接放进index指向的位置,4 5 意味着 u[4]=5,cnt判断是不是两个向量都有这个维的数据,如果有,就用record记录下来。最后直接用record进行查找
#include<stdio.h>
int main()
{
int n,a,b;
int i,j=0,p,q,x,total;
long long int sum=0;
scanf("%d %d %d", &n,&a,&b);
int u[n+1];
int v[n+1];
int cnt[n+1];
x=a>b?a:b;
int record[x];
for(i=0;i<n+1;i++)
{
u[i]=v[i]=cnt[i]=0;
}
i=0;
while(i<a)
{
scanf("%d %d",&p,&q);
u[p]=q;
i++;
cnt[p]++;
}
i=0;
while(i<b)
{
scanf("%d %d",&p,&q);
v[p]=q;
i++;
cnt[p]++;
if(cnt[p]==2)
{
record[j++]=p;
}
}
total=j;
for(i=0;i<total;i++)
{
p=record[i];
sum+=u[p]*v[p];
}
printf("%lld",sum);
return 0;
}
以下为100分代码思路: 如果index为顺序输入,就按index查找,如果u[i].index==v[j].index,则计算其乘积,同时,在查找v的时候可以从v[j].index的下一个查找;如果u[i].index<v[j].index,说明v[j-1].index小于u[i].index,v[j].index大于u[i].index,没有等于u[i].index的那么在查找v的时候可以从v[j].index开始查找。尽管是for循环嵌套,但复杂度小于O(a*b)。 以下为100分代码:
#include<stdio.h>
typedef struct s
{
int index;
int value;
}S;
int main()
{
int n,a,b;
int i,j,temp=0;
long long int sum=0;
scanf("%d %d %d", &n,&a,&b);
S u[a],v[b];
i=0;
while(i<a)
{
scanf("%d %d",&u[i].index,&u[i].value);
i++;
}
i=0;
while(i<b)
{
scanf("%d %d",&v[i].index,&v[i].value);
i++;
}
for(i=0;i<a;i++)
{
for(j=temp;j<b;j++)
{
if(u[i].index==v[j].index)
{
sum+=u[i].value*v[j].value;
temp=j+1;
break;
}
if(u[i].index<v[j].index)
{
temp=j;
break;
}
}
}
printf("%lld",sum);
return 0;
}
|