E - 和为给定数
题目
蒜头君给出若干个整数,询问其中是否有一对数的和等于给定的数。
输入格式
第一行输入n,代表有n个整数。(0<n<=10^8)
第二行输入n个整数。(0~200000000)
第三行输入m,代表需要得到的和。(0<=m<=2^30)
输出格式
若存在和为 m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行"No"。
Sample Input
4
2 5 1 4
6
Sample Output
1 5
解题思路:
先将输入的n个整数按从小到大排序,再让第一个数和第n个数相加与m比较,
如果相等,输出第一个数和第n个数,程序结束。
如果小于m,则用第二个数和第n个数相加与m比较,如果还是小于m,则用第三个数和第n个数的和与m相比较,以此类推。
如果大于m,则用第一个数和第n-1个数的和与m比较,如果还是大于m,则用第一个数和第n-2个数的和与m比较,以此类推。
代码如下:
#include
#include
#define N 10000001
using namespace std;
int a[N];
int main()
{
long long m,n,i,j;
cin>>m;
for(i=1;i<=m;i++)
{
cin>>a[i];
}
cin>>n;
sort(a+1,a+1+m);//从小到大排序
i=1;
j=m;
while(i<j)
{
if(a[i]+a[j]==n)
{
cout<<a[i]<<" "<<a[j]<<endl;
return 0;//程序结束
}
else if(a[i]+a[j]<n)
i++;
else
j–;
}
cout<<“No”<<endl;
}