51Nod-1090 3个数和为0【排序+二分查找】
第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
如果没有符合条件的组合,输出No Solution。 如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
7 -3 -2 -1 0 1 2 3
-3 0 3 -3 1 2 -2 -1 3 -2 0 2 -1 0 1
问题链接:51Nod-1090 3个数和为0
问题分析:数进行排序后,两次查找,最后使用二分查找。
程序说明:
设查找的数为x+y+z,那么x+y+z=0。
x用枚举试探,可以是a[0]-a[n-2-1]之一。
对于y,若x=a[i]则y可以是a[i+1]-a[n-1-1],逐个试探。
最后用z=-(x+y)进行二分查找,若y=a[i]则z可以是a[i+1]-a[n-1]之一。
题记:(略)
参考链接:51Nod-1001 数组中和等于K的数对【排序+二分查找】
AC的C++程序如下:
#include <iostream>
#include <algorithm>
#include <stdio.h>using namespace std;const int N = 50000;
int a[N];
int n, x, y, z;
bool flag;bool search(int v, int start)
{int end = n - 1, mid;bool sflag;sflag = false;while(start <= end) {mid = (start + end) / 2;if(a[mid] == v) {sflag = true;break;} else if(a[mid] < v)start = mid + 1;else if(a[mid] > v)end = mid - 1;}return sflag;
}void search2(int start)
{for(int i=start; i<n-1; i++) {y = a[i];z = -(x + y);if(a[i + 1] <= z && search(z, i + 1)) {printf("%d %d %d\n", x, y, z);flag = false;}}
}int main()
{scanf("%d", &n);for(int i=0; i<n; i++)scanf("%d", &a[i]);sort(a, a+n);flag = true;for(int i=0; i<n-2; i++) {if(a[i] >= 0)break;x = a[i];search2(i + 1);}if(flag)printf("No Solution\n");return 0;
}
51Nod-1090 3个数和为0【排序+二分查找】相关推荐
- 51nod 1267 4个数和为0 思路:哈希map+避免重复的点
题目: 总结大佬们的思路: 思路1:所有数两两求和,存入map中,每次判断有没有相反数被标记过. 思路2:对所有数排序,排完所有数两两求和,结果正好是排好序的.然后扫一遍,二分查找看之前有没有相反数存 ...
- [51nod] 1267 4个数和为0
1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes&q ...
- problem k: 查找某一个数_quot;细节魔鬼quot; 二分查找
❝ 二分查找,是一个高效,实用,且易理解的一个查找算法, 通常时间复杂度为O(lgn).局限性在于,待查找对象必须为有序的数组:数据量过小,优势不明显,数据量过大,数组大小受限于内存. 除此之外,二分 ...
- LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)
1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...
- 51Nod-1001 数组中和等于K的数对【排序+二分查找】
1001 数组中和等于K的数对 基准时间限制:1秒 空间限制:131072KB 分值:5难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对. ...
- StringBuffer+排序+二分查找+包装类+正则表达式+常用类
一.StringBuffer 1.概述 我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.而StringBuffer就可以解决这个问题StringBuffe ...
- 数据结构/算法笔记(1)-两种排序 二分查找
快速排序 确定分界点:在数组中选一个元素的值 x x x 作为分界,(某人说)可任取 (重点)调整区间:以 x x x 为准,将数组分为左右两段,通过换位保证左边都≤x,右边都≥x,即可 递归分别处理 ...
- LeetCode LCP 28. 采购方案(排序 + 二分查找)
文章目录 1. 题目 2. 解题 1. 题目 小力将 N 个零件的报价存于数组 nums. 小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案. 注 ...
- 【数据结构与算法】task3 排序二分查找
排序 参考:https://github.com/wangzheng0822/algo/tree/master/python 归并排序 def merge_sort(a):_merge_sort_be ...
最新文章
- C++对象赋值的四种方式
- P1209 [USACO1.3]修理牛棚 Barn Repair(贪心+逆向思维)难度⭐⭐⭐
- 如何发现数据中的异常值?对异常值是怎么处理的?
- linux升级内核后反复重启,Ubuntu 14.04 升级内核后重启开机黑屏解决
- python安装pandas模块-python安装numpy和pandas的方法步骤
- 【CV】图像分析用 OpenCV 与 Skimage,哪一个更好?
- Django缩略图实现
- CentOS7安装ipython
- 如何停止一个正在运行的java线程
- (图文详细)如何使用Code::Blocks运行c/cpp文件?
- Linux操作系统内核启动参数详细解析[转]
- 不学点《近世代数》怎么学好现代密码学
- 数论概论笔记 第3章 勾股数组与单位圆
- 面试复盘:2020.09.09
- python将中文汉字转换成拼音
- 萝卜干煎蛋,榨菜,白粥,很美丽
- mesh 协调器 路由器_为什么WiFi6和MESH是绝配
- 用HTML制作用户注册网页
- C++面向对象程序设计实验题:有理数类(分数类)设计
- Java实现 蓝桥杯 算法提高 Monday-Saturday质因子
热门文章
- ArcGIS GDB中要素类不可编辑
- sass-loader高版本的坑
- mysql 5.5 主从_Mysql5.5常用命令及主从配置
- arduino eeg脑电模块_应用深度学习EEGNet来处理脑电信号
- onepill Android端
- linux下载镜像的命令wget,Linux wget命令整站下载做网站镜像
- 为什么应尽量从列表的尾部进行元素的增加与删除操作?
- 第八届蓝桥杯第八题日期问题
- 机器学习代码实战——K折交叉验证(K Fold Cross Validation)
- 剑指offer面试题22. 链表中倒数第k个节点(链表)