题目链接:https://www.patest.cn/contests/pat-a-practise/1048
题目大意:给出一个数列和一个值m,找出数列中的两个数v1,v2使得v1+v2=m。并且v1<=v2,若不唯一,输出v1最小的那个
解题思路:
- 先将数列排序
- 定义i,j,从数列的左侧和右侧开始扫描,并计算临时和
- 和较大j前移,和较小i后移,知道找到合适的i,j
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main(int argc, char const *argv[])
{
int n,m;
cin>>n>>m;
int buf[n];
for(int i=0;i<n;i++)
scanf("%d",&buf[i]);
//先升序排序
sort(buf,buf+n);
int i=0,j=n-1,tmp;
while(i<j){
//临时和
tmp=buf[i]+buf[j];
if(tmp<m)//临时和较小
i++;//左边指针右移
else if(tmp>m)//临时和较大
j--;//右边指针左移
else{
cout<<buf[i]<<" "<<buf[j]<<endl;
return 0;
}
}
cout<<"No Solution"<<endl;
return 0;
}