分治&&一本通1244

分治就是把一组大数据分成小数据管理,如1000可以分成1-500,501-1000分开操作。

ybt1244:和为给定数

【题目描述】

给出若干个整数,询问其中是否有一对数的和等于给定的数。

【输入】

第一行是整数n(0 < n ≤ 100,000),表示有n个整数。

第二行是n个整数。整数的范围是在00到108108之间。

第三行是一个整数m0m230)m(0≤m≤230),表示需要得到的和。

【输出】

若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。

#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000000];
int num;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	cin>>num;
	int l=1,r=n;
	sort(a+1,a+n+1);
	while(a[l]+a[r]!=num&&l<r)
	{
		if(a[l]+a[r]>num)r--;
		if(a[l]+a[r]<num)l++;
	}
	if(l>=r)cout<<"No"<<endl;
	else cout<<a[l]<<' '<<a[r]<<endl;
	return 0;
}
这道题不是我的思路,这道题是先排序,在首尾相加,大了找小的,小了找大的,很简洁,也很能体现分治的思想,相对较容易理解。
posted @ 2020-02-28 14:30  国服混子瑶  阅读(452)  评论(0编辑  收藏  举报