E - 和为给定数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值