和为给定数

题目链接:https://bzoj.org/p/P05513
Description
给出若干个整数,询问其中是否有一对数的和等于给定的数,这样的一对数下标可以相等.
Input
第一行是整数n(0<n≤1e5),表示有n个整数.
第二行是n个整数,整数的范围是在0到1e8之间.
第三行是一个整数m(0≤m≤2^30),表示需要得到的和.
Output
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开.
若有多个数对满足条件,选择数对中较小的数更小的.
若找不到符合要求的数对,输出一行No.
Samples
输入数据 1
4
2 5 1 4
6
输出数据 1
1 5
输入数据 2
4
1 2 5 7
4
输出数据 2
2 2
输入数据 3
10
99 36 7 12869 26538 88 127 62 20086 12564
153
输出数据 3
No
①Sol:有些难度,不过可以用二分法查找
代码:

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main() 
{
	int n,x,l=0,r=0,mid=0;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	cin>>x;
	sort(a+1,a+n+1);//排序才可以开始查找
	for(int i=1;i<=n;i++){
		r=n;
		l=i;
		while(l<=r)
		{
			mid=(l+r)/2;//中间位置
			if(a[mid]+a[i]<x) l=mid+1;
			else if(a[mid]+a[i]>x) r=mid-1;
			else
			{
				cout<<a[i]<<" "<<a[mid];
				return 0;//找到了就输出
			}
		}
	}
	cout<<"No"<<endl;//否则输出No
	return 0;
}

②Sol:可以用首尾两指针的方法来做
代码:

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main() 
{
	int n,x;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	cin>>x;
	int l=1,r=n;//首指针和尾指针
	while(l<=r){
		if(a[l]+a[r]>x) r--;//如果和大于x,就把尾指针左移
		else if(a[l]+a[r]==x){
			cout<<min(a[l],a[r])<<" "<<max(a[l],a[r]);//如果等于x,就直接输出
			return 0;
		}
		else l++;//否则将首指针右移
	}
	cout<<"No";//如果没找到就输出No
	return 0;
}

创作不易,点个赞再走吧!

posted @ 2024-07-07 21:42  Ace基德  阅读(40)  评论(0)    收藏  举报