二分查找 先进行递增排序 然后找到的第一个即为最小
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iterator>
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std;
int doudiv(int a[],int index,int n,int m)
{
int left=index+1;
int right=n;
int mid;
int t=m-a[index];
while(left<right)
{
mid=(left+right)/2;
if(a[mid]==t)
return 1;
else if(a[mid]>t)
right=mid;
else
left=mid+1;
}
return 0;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
vector<int> v;
int a[100000];
int i;
for( i=0;i<n;i++)
scanf("%d",&a[i]);
int t;
sort(a,a+n);
for(int j=0;j<n;j++)
{
if(doudiv(a,j,n,m))
{
v.push_back(a[j]);
break;
}
}
if(v.size()!=0)
{
printf("%d %d\n",v[0],m-v[0]);
}
else
printf("No Solution\n");
return 0;
}