題目鏈接: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;
}