要注意如果直接遍历金钱的列表会导致超时
所以利用散列函数直接寻找需要的值,或者利用二分法,我用的是散列
参考了晴神的算法思路
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s1[110000]={0};
bool cmp(int a,int b)
{
if(a==0||b==0) return a>b;
else return a<b;
}
int main()
{
int n,m;
memset(s1,0,sizeof(s1));
cin>>n>>m;
while(n--)
{
int a;
cin>>a;
s1[a]++;
}
for(int i=1;i<1000;i++)
{
if(s1[i]>0)
{
if(s1[m-i]>0)
{
if(i==m-i)
{
if(s1[i]>=2)
{ cout<<i<<" "<<i;
return 0;}
}
else
{ cout<<i<<" "<<m-i;
return 0;}
}
}
}
cout<<"No Solution";
}
以下是我一开始的算法 ,测试点3,4超时
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s1[110000]={0};
bool cmp(int a,int b)
{
if(a==0||b==0) return a>b;
else return a<b;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>s1[i];
}
sort(&s1[0],&s1[n],cmp);
for(int i=0;i<n;i++)
{
int sum=0;
if(s1[i]>m) {
break;
}
for(int j=i+1;j<n;j++)
{
sum=s1[i]+s1[j];
if(sum==m)
{
cout<<s1[i]<<" "<<s1[j];
return 0;
}
if(sum>m)
break;
}
}
cout<<"No Solution";
}