分治&&一本通1244
分治就是把一组大数据分成小数据管理,如1000可以分成1-500,501-1000分开操作。
ybt1244:和为给定数
【题目描述】
给出若干个整数,询问其中是否有一对数的和等于给定的数。
【输入】
第一行是整数n(0 < n ≤ 100,000),表示有n个整数。
第二行是n个整数。整数的范围是在00到108108之间。
第三行是一个整数m(0≤m≤230)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; }
这道题不是我的思路,这道题是先排序,在首尾相加,大了找小的,小了找大的,很简洁,也很能体现分治的思想,相对较容易理解。