OpenJudge 1.11-0.7 和为给定数
来源:互联网 发布:路易斯威廉姆斯数据 编辑:程序博客网 时间:2024/04/23 16:18
描述
给出若干个整数,询问其中是否有一对数的和等于给定的数。
输入
共三行:
第一行是整数n(0 < n <= 100,000),表示有n个整数。
第二行是n个整数。整数的范围是在0到10^8之间。
第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和。
输出
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。
样例输入
4
2 5 1 4
6
样例输出
1 5
这个题也是很水的,下面讲讲思路:
很简单 就是二分招数(这不废话么……)
咳咳 ,好吧。不绕弯了,题目给了你两个数,这咋找呢?
二分不能找两个数,所以我们想到找一个。
于是先排序,上sort。
先用m减去最小的a[i];
即 b=m-a[i];再二分查找b就OK了
就算题目说选择更小的数,那也没关系,从最小开始找
已经解决这个问题了。
值得注意的是
看下面的数据:
4
1 2 3 9
6
容易一眼看出了 其实应该是输出”No”的,
但是程序容易输出3 3
这是一个坑分的地方,因为一个数不能用两遍(程序不知道啊),
所以要你来解决,
只要把用的这个a[i]=0;找完一遍再赋值回来就行了!
还有二分区间的边界
如果 l=0,r=n+1的话
while(l < r )
如果 l=1,r=n的话
就找
while( l <= r )
(这个区间坑我了好久(>_<) )
好了废话不多说了上代码:
#include<bits/stdc++.h>using namespace std;int a[1000010];int main(){ int n,m,l,r,mid; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; cin>>m; sort(a+1,a+n+1); for(int i=1;i<=n;i++) { int b=m-a[i]; int tot=a[i]; a[i]=0; l=1;r=n; while(l<=r) { mid=(l+r)/2; if(b==a[mid]) { cout<<m-b<<" "<<a[mid]; return 0; } if(b>a[mid]) l=mid+1; else r=mid-1; } a[i]=tot; } cout<<"No"; return 0;
0 0
- OpenJudge 1.11-0.7 和为给定数
- 【openjudge】和为给定数 二分查找
- Openjudge NOI题库1.11编程基础之二分查找07 和为给定数
- 和为给定数
- OpenJudge_P8207 和为给定数
- 4143:和为给定数
- POJ4143和为给定数
- 07:和为给定数OJ
- Open judge 07和为给定数
- 计算和为给定数的连续正整数数列
- 寻找和为给定数的连续正整数数列
- Bailian4143 和为给定数【排序+二分】
- 在给定数组中查找两个数的和为给定值sum
- 1. Two Sum 给定一个数组和一个数,输出两个和为给定数的数组元素的下标
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 求一组数中的的和为给定值的三个数(3sum)
- 【100题】在排序数组中查找和为给定值的两个数
- 排序数组中查找和为给定值的两个数O(n)
- Android面试题二
- 基于startActivityForResult实现返回键
- Nosql之Redis: zset(有序集)数据类型及操作命令
- 前端开发、IDE、Node.js与Sublime text3
- max submatrix which has all borders the same color.
- OpenJudge 1.11-0.7 和为给定数
- STL之优先队列
- 神经网络与BP算法推导
- 利用js实现注册问题中的一些验证
- 03_Flink Streaming SinkFunction
- 287. Find the Duplicate Number #Hard
- Redis数据库(string和hash类型)
- connection.prepareStatement(sql).execute()返回值boolen类型什么意思?
- 工业电表接线方法,光纤接线方法、97,、2007协议