题目链接: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;
}
创作不易,点个赞再走吧!
标签:输出,int,数据,cin,整数,定数,指针 From: https://www.cnblogs.com/Ace-29/p/18288973