信息学奥赛一本通 1244:和为给定数 | OpenJudge NOI 1.11 07:和为给定数
【题目链接】
ybt 1244:和为给定数
OpenJudge NOI 1.11 07:和为给定数
【题目考点】
1. 二分:查找某个数是否存在
代码模板为:
while(l <= r)
{m = (l+r)/2;if(a[m] > x)r = m-1;else if(a[m] < x)l = m+1;elsebreak;//找到解
}
【解题思路】
指定的加和为mmm。
对数字序列进行升序排序后,遍历这个数字序列。
每遍历到一个数字aia_iai,通过二分查找看序列中是否存在数字m−aim-a_im−ai。
二分查找时,左端点lll要设为i+1,右端点rrr为nnn。如果lll为1,rrr为nnn,则当ai∗2=ma_i*2=mai∗2=m时,会找到自己,而数组中实际上不存在两个aia_iai,这是不符合题意的。
如果存在这个数字,那么输出数对aia_iai与m−aim-a_im−ai,程序结束。如果到最后也没有输出过数对,输出"No"。
【题解代码】
解法1:二分:查找数字是否存在
#include <bits/stdc++.h>
using namespace std;
#define N 100005
int main()
{int n, m, a[N], num;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];cin >> m;sort(a+1, a+1+n);//升序排序 for(int i = 1; i <= n && a[i] < m; ++i)//a[i]:数对中较小的数字 {num = m - a[i];//看看数列中是否存在num这个数字,如果存在,那么数对为a[i], numint l = i+1, r = n, mid;//二分查找,是否存在a[mid]值为num (如果l为1,r为n,可能找到自己i,当a[i]*2==m时,条件也能过,这是不符合题意的) while(l <= r){mid = (l + r) / 2;if(a[mid] > num)r = mid - 1;else if(a[mid] < num)l = mid + 1;else{//输出结果 cout << a[i] << ' ' << num;return 0;}}}cout << "No";return 0;
}
解法2:使用stl binary_search函数
#include <bits/stdc++.h>
using namespace std;
#define N 100005
int main()
{int n, m, a[N], num;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];cin >> m;sort(a+1, a+1+n);//升序排序 for(int i = 1; i <= n && a[i] < m; ++i)//a[i]:数对中较小的数字 {num = m - a[i];//看看数列中是否存在num这个数字,如果存在,那么数对为a[i], numif(binary_search(a+i+1, a+1+n, num))//如果a[i+1]~a[n]存在数字num {//输出结果 cout << a[i] << ' ' << num;return 0;}}cout << "No";return 0;
}
信息学奥赛一本通 1244:和为给定数 | OpenJudge NOI 1.11 07:和为给定数相关推荐
- 信息学奥赛一本通 1135:配对碱基链 | OpenJudge NOI 1.7 07
[题目链接] ybt 1135:配对碱基链 OpenJudge NOI 1.7 07:配对碱基链 [题目考点] 1. 字符串处理 字符处理有两种方法 每次读入一个字符,处理这一字符 char c; w ...
- 信息学奥赛一本通 1064:奥运奖牌计数 | OpenJudge NOI 1.5 07
[题目链接] ybt 1064:奥运奖牌计数 OpenJudge NOI 1.5 07:奥运奖牌计数 [题目考点] 1. 循环求和 设置加和变量s,记住要将其初始化为0.int s = 0; 循环读入 ...
- 信息学奥赛一本通 1020:打印ASCII码 | OpenJudge NOI 1.2 07
[题目链接] ybt 1020:打印ASCII码 OpenJudge NOI 1.2 07:打印ASCII码 [题目考点] 1. ASCII码表 ASCII码表是一张表,规定了0~127各数字对应的字 ...
- 信息学奥赛一本通 1404:我家的门牌号 | OpenJudge NOI 2.1 7649:我家的门牌号 | 小学奥数 7649
[题目链接] ybt 1404:我家的门牌号 OpenJudge NOI 2.1 7649:我家的门牌号 OpenJudge NOI 小学奥数 7649:我家的门牌号 注意:一本通OJ和OpenJud ...
- 信息学奥赛一本通 1084:幂的末尾 | OpenJudge NOI 小学奥数 7833
[题目链接] ybt 1084:幂的末尾 OpenJudge NOI 小学奥数 7833:幂的末尾 [题目考点] 1. 同余定理 根据同余定理,有: (a∗b)%m=(a%m∗b%m)%m(a*b)\ ...
- 信息学奥赛一本通 1083:计算星期几 | OpenJudge NOI 小学奥数 7831
[题目链接] ybt 1083:计算星期几 OpenJudge NOI 小学奥数 7831:计算星期几 [题目考点] 1. 同余定理 根据同余定理,有: (a∗b)%m=(a%m∗b%m)%m(a*b ...
- 信息学奥赛一本通 1080:余数相同问题 | OpenJudge NOI 小学奥数/2.1 7647:余数相同问题
[题目链接] ybt 1080:余数相同问题 OpenJudge NOI 2.1 7647:余数相同问题 OpenJudge NOI 小学奥数 7647:余数相同问题 [题目考点] 1. 枚举 [解题 ...
- 信息学奥赛一本通 1227:Ride to Office | OpenJudge NOI 4.6 2404:Ride to Office
[题目链接] ybt 1227:Ride to Office OpenJudge NOI 4.6 2404:Ride to Office 原题是英文题,虽说两题题意相同,但一本通网站没有对该问题进行直 ...
- 信息学奥赛一本通 1223:An Easy Problem | OpenJudge NOI 4.6 1455:An Easy Problem
[题目链接] ybt 1223:An Easy Problem OpenJudge NOI 4.6 1455:An Easy Problem [题目考点] 1. 数制 2. 枚举 [解题思路] 解法1 ...
最新文章
- linux系统默认硬盘启动,帮助中心--起点操作系统(StartOS)官方网站
- c语言程序 实现简单计算器功能,C语言实现简单计算器小项目
- OpenGL LoadTexture加载纹理的实例
- js只能输入数字[价格等]
- python函数参数列表中的*与**
- 圆环同心度测量halcon
- MD5计算,一个扩展类,哪里都能用
- php 数组元素往后移动,php 二维数组 元素移动
- 《C和指针》——宏中容易出现的错误
- java怎么让窗口居中显示图片_Java_Swing中让窗口居中显示的方法(三种方法)
- C语言之extern关键字探究
- 如何用sklearn创建机器学习分类器?这里有一份上手指南
- 看到这个我冷汗直冒,还好不是指我……
- 装饰者模式(Decorator pattern)
- 联想(ThinkServer) RD650做硬件 raid5 配置
- Android的单位及屏幕分辨率
- 踩坑日记(一):半夜打DBA电话解决数据库连接超时自动回滚问题
- ElementUI table 样式修改
- esxi7.0 打包网卡驱动
- python画立体的心_在python3中绘制三维多边形