前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
/* 给定n枚硬币,每枚硬币有各自的价值,要你找到两枚硬币的价值v1,v2之和恰好 等于价值m,(v1<=v2),若有多组结果满足条件,输出v1最小的那组结果,若没有 输出结果,则输出No Solution 思路: 双指针法,首选对所有硬币的价值排序,i,j两个指针初始分别指向0和n-1, 不断i++或者j--直到满足a[i]+a[j]==m,此时必定是最小的v1且满足条件, 直接输出即可 */
const int N=1e5+10;
int a[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
int i=0,j=n-1;
while(i<j){
if(a[i]+a[j]<m)i++;
else if(a[i]+a[j]>m)j--;
else {
printf("%d %d\n",a[i],a[j]);
break;
}
}
if(i==j)printf("No Solution\n");
return 0;
}