该题题意比较容易理解,即找到两个数组中index相等的点的value相乘叠加即可
第一思路:
使用一个哈希函数存储所有的index与value,如果遇到重复的index就将其value相乘叠加
但是这里因为n的值最大可达10^9,哈希数组不可能开那么大,因此该算法只能拿60分
强调 存储叠加的变量一定要开long long 因为value值最大可达10^6
#include<iostream> using namespace std; const int sizee=5e5+10; int n,a,b; int arr[sizee]; long long ans=0;//一定要long long int main(){ cin>>n>>a>>b; for(int i=0;i<a;i++){ int index,value; cin>>index>>value; arr[index]=value; } for(int i=0;i<b;i++){ int index,value; cin>>index>>value; if(arr[index]){ ans+=arr[index]*value; } } cout<<ans<<endl; return 0; }
第二思路
二分优化的暴力算法
我们枚举a数组中的每一个index1,再嵌套循环二分查找b数组中的index2,找到就value相乘叠加,反之忽略
强调 存储叠加的变量一定要开long long 因为value值最大可达10^6
时间复杂度为O(nlogn)足以
#include<iostream> using namespace std; typedef struct Node{ int index,value; }Node; int n,a,b; long long ans=0; Node arr1[500005],arr2[500005]; int search(int v){//在arr2中查找index为v的下标返回 int left=1,right=b; while(left<=right){ int mid=(left+right)/2; if(arr2[mid].index==v){ return mid; }else if(arr2[mid].index<v){ left=mid+1; }else if(arr2[mid].index>v){ right=mid-1; } } return -1;//没找到返回-1 } int main(){ cin>>n>>a>>b; for(int i=1;i<=a;i++){ cin>>arr1[i].index>>arr1[i].value; } for(int i=1;i<=b;i++){ cin>>arr2[i].index>>arr2[i].value; } for(int i=1;i<=a;i++){ int index1=arr1[i].index,value1=arr1[i].value; int index2=search(index1); if(index2!=-1){ ans+=value1*arr2[index2].value; } } cout<<ans<<endl; return 0; }
思路三