【题目链接】

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:和为给定数相关推荐

  1. 信息学奥赛一本通 1135:配对碱基链 | OpenJudge NOI 1.7 07

    [题目链接] ybt 1135:配对碱基链 OpenJudge NOI 1.7 07:配对碱基链 [题目考点] 1. 字符串处理 字符处理有两种方法 每次读入一个字符,处理这一字符 char c; w ...

  2. 信息学奥赛一本通 1064:奥运奖牌计数 | OpenJudge NOI 1.5 07

    [题目链接] ybt 1064:奥运奖牌计数 OpenJudge NOI 1.5 07:奥运奖牌计数 [题目考点] 1. 循环求和 设置加和变量s,记住要将其初始化为0.int s = 0; 循环读入 ...

  3. 信息学奥赛一本通 1020:打印ASCII码 | OpenJudge NOI 1.2 07

    [题目链接] ybt 1020:打印ASCII码 OpenJudge NOI 1.2 07:打印ASCII码 [题目考点] 1. ASCII码表 ASCII码表是一张表,规定了0~127各数字对应的字 ...

  4. 信息学奥赛一本通 1404:我家的门牌号 | OpenJudge NOI 2.1 7649:我家的门牌号 | 小学奥数 7649

    [题目链接] ybt 1404:我家的门牌号 OpenJudge NOI 2.1 7649:我家的门牌号 OpenJudge NOI 小学奥数 7649:我家的门牌号 注意:一本通OJ和OpenJud ...

  5. 信息学奥赛一本通 1084:幂的末尾 | OpenJudge NOI 小学奥数 7833

    [题目链接] ybt 1084:幂的末尾 OpenJudge NOI 小学奥数 7833:幂的末尾 [题目考点] 1. 同余定理 根据同余定理,有: (a∗b)%m=(a%m∗b%m)%m(a*b)\ ...

  6. 信息学奥赛一本通 1083:计算星期几 | OpenJudge NOI 小学奥数 7831

    [题目链接] ybt 1083:计算星期几 OpenJudge NOI 小学奥数 7831:计算星期几 [题目考点] 1. 同余定理 根据同余定理,有: (a∗b)%m=(a%m∗b%m)%m(a*b ...

  7. 信息学奥赛一本通 1080:余数相同问题 | OpenJudge NOI 小学奥数/2.1 7647:余数相同问题

    [题目链接] ybt 1080:余数相同问题 OpenJudge NOI 2.1 7647:余数相同问题 OpenJudge NOI 小学奥数 7647:余数相同问题 [题目考点] 1. 枚举 [解题 ...

  8. 信息学奥赛一本通 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 原题是英文题,虽说两题题意相同,但一本通网站没有对该问题进行直 ...

  9. 信息学奥赛一本通 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 ...

最新文章

  1. linux系统默认硬盘启动,帮助中心--起点操作系统(StartOS)官方网站
  2. c语言程序 实现简单计算器功能,C语言实现简单计算器小项目
  3. OpenGL LoadTexture加载纹理的实例
  4. js只能输入数字[价格等]
  5. python函数参数列表中的*与**
  6. 圆环同心度测量halcon
  7. MD5计算,一个扩展类,哪里都能用
  8. php 数组元素往后移动,php 二维数组 元素移动
  9. 《C和指针》——宏中容易出现的错误
  10. java怎么让窗口居中显示图片_Java_Swing中让窗口居中显示的方法(三种方法)
  11. C语言之extern关键字探究
  12. 如何用sklearn创建机器学习分类器?这里有一份上手指南
  13. 看到这个我冷汗直冒,还好不是指我……
  14. 装饰者模式(Decorator pattern)
  15. 联想(ThinkServer) RD650做硬件 raid5 配置
  16. Android的单位及屏幕分辨率
  17. 踩坑日记(一):半夜打DBA电话解决数据库连接超时自动回滚问题
  18. ElementUI table 样式修改
  19. esxi7.0 打包网卡驱动
  20. python画立体的心_在python3中绘制三维多边形

热门文章

  1. 【秋招计划】 15日~18日重邮秋季校园招聘宣讲会计划
  2. Unity 湖泊的绘制
  3. 墨者学院刷题笔记——SQL手工注入漏洞测试(MongoDB数据库)
  4. 网络控制软件国内外引发争议
  5. mysql0xc00007b_安装MySQL被提示缺少msvcr120.dll,msvcp120.dll或提示0xc00007b错误
  6. 诺基亚智能手机未来仅采用Symbian和MeeGo系统
  7. C和C++哪个更快?
  8. Django中ORM的具体使用,超全超长超好懂
  9. 【2022】软件著作权登记流程及费用
  10. 下载IEEE文章步骤