前言

传送门

正文

参考题解

#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;
}