题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805432256675840
【分析】
题意:从N个数里找出两个数值加起来刚好等于M的数。如果有多组,只输出前面的数最小的那一组。否则,No Solution。
思路:二分查找。因为只输出一组,所以,只要找到一组就return掉就好。这样也保证了是最小的那组。
也可以用哈希散列做,数组存储N个数里每个数出现的次数,然后i从1~M遍历,只要M-i的个数≥1即可输出。如果i=M-i,再讨论即可。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int val[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&val[i]);
sort(val,val+n);
for(int i=0;i<n;i++)
{
int st=i+1,ed=n;
while(st<ed)
{
int mid=(st+ed)/2;
if(val[mid]>m){
ed=mid;
continue;
}
if(val[i]+val[mid]>m)ed=mid;//,cout<<"ok\n";
else if(val[i]+val[mid]==m){
printf("%d %d\n",val[i],val[mid]);
return 0;
}
else st=mid+1;
}
if(val[i]>m)break;
}
printf("No Solution\n");
return 0;
}