我用二分法做的~复杂度是nlogn,下面附上同学做的简洁版本。代码如下
#include <stdio.h>//二分法
#include <algorithm>
using namespace std;
#define MAXN 100008
int n,m,flag=0;//flag=1表示有解
int coins[MAXN];
int binarysearch(int low,int high,int key){
if (low>high) {
return -1;
}
int ans=-1;
int mid=(low+high)/2;
if (coins[mid]==key)
ans=mid;//返回的是下标而不是元素
if(coins[mid]>key)//应该向左边找
ans=binarysearch(low, mid-1, key);
if (coins[mid]<key) {//向右边找
ans=binarysearch(mid+1, high, key);
}
return ans;
}
int main(){
int v1,v2;
freopen("/Users/pantingting/Documents/code/data/input", "r", stdin);
scanf("%d%d",&n,&m);
for (int i=0; i<n; i++) {
scanf("%d",&coins[i]);
}
sort(coins,coins+n);
if(m<coins[0]||m>coins[n-1]) flag=0;
for (int i=0; i<n; i++) {
int key=m-coins[i];
if (key>0) {
int ans= binarysearch(0,n-1,key);
if (ans!=-1&&ans!=i) {
flag=1;
v1=coins[i];
v2=coins[ans];
break;
}
}
}
if (flag)
printf("%d %d\n",v1,v2);
else
printf("No Solution\n");
return 0;
}
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
int value[100001];
int main()
{
int N,M;
cin>>N>>M;
int i=0;
while(i<N)scanf("%d",&value[i++]);
sort(value,value+N);
int j=0,k=N-1;
while(j<k)
{
if(value[j]+value[k]>M)k--;
else if(value[j]+value[k]<M)j++;
else
{
cout<<value[j]<<" "<<value[k]<<endl;
break;
}
}
if(j>=k)cout<<"No Solution"<<endl;
return 0;
}