UVa 10125 Sumsets (折半枚举&二分查找)

HCIA-Storage 存储工程师学习笔记——1. 存储技术趋势 文章目录1. 存储技术趋势1.1 数据、信息与数据存储1.2 存储技术的发展①存储架构的发展②存储介质的发展③ 接口协议的发展1.3 存储产品的发展趋势 华为HCIA-Storage认证地址:https://e.huawei.com/cn/talent/#/cert/roadmap 1. 存储技术趋势 1.1 数据、信息与数据存储 什么是数据? ​ 数据是对所有事物的数字表示。 数据的种类? 结构化数据 半结构化数据 非结构化数据 数据的处理周期 ​ 数据处理是人或机器对数据进行的重组或重新排序, 阅读详情

10125 - Sumsets

Time limit: 3.000 seconds 

http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1066

Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.

Input

Several S, each consisting of a line containing an integer 1 <= n <= 1000 indicating the number of elements in S, followed by the elements of S, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.

Output

For each S, a single line containing d, or a single line containing "no solution".

Sample Input

5
2 
3 
5 
7 
12
5
2 
16 
64 
256 
1024
0

Output for Sample Input

12
no solution


思路见代码注释。

复杂度:O(n^2 log n)

/*0.072s*/

#include<bits/stdc++.h>
using namespace std;

struct node
{
	int a, b, sum; ///注意已经保证了a<b;
	bool operator < (const node& a) const
	{
		return sum < a.sum;
	}
} sum[499505], tmpsum;
int a[1005], tmp[4], n, c, ans, low, upp;

inline bool notequal()///判断这4个数是否互不相同
{
    int i,j;
	for (i = 0; i < 3; ++i)
		for (j = i + 1; j < 4; ++j)
			if (tmp[i] == tmp[j]) return false;
	return true;
}

bool solve()
{
    int i,j,k;
	for (i = n - 1; i >= 0; --i)///从S中最大的枚举d
		for (j = 0; j < n; ++j)///枚举c
		{
			if (j == i) continue;
			tmp[0] = a[i], tmp[1] = a[j];///a[i]是d,a[j]是c
			tmpsum = (node){a[i], a[j], a[i] - a[j]};///d-c
			low = lower_bound(sum, sum + c, tmpsum) - sum, upp = upper_bound(sum, sum + c, tmpsum) - sum;///二分找d-c
			for (k = low; k < upp; ++k)
			{
				tmp[2] = sum[k].a, tmp[3] = sum[k].b;///a和b
				if (notequal())
				{
					ans = a[i];
					return true;
				}
			}
		}
	return false;
}

int main()
{
    int i,j;
	while (scanf("%d", &n), n)
	{
		for (i = 0; i < n; ++i) scanf("%d", &a[i]);
		if (n < 4)
		{
			puts("no solution");
			continue;
		}
		sort(a, a + n);
		c = 0;
		for (i = 0; i < n - 1; ++i)
			for (j = i + 1; j < n; ++j)
				sum[c++] = (node){a[i], a[j], a[i] + a[j]};///枚举S中任意两个元素之和,并排序
		sort(sum, sum + c);
		if (solve()) printf("%d\n", ans);
		else puts("no solution");
	}
	return 0;
}


一个更快的算法:(调整法)

/*0.019s*/

#include<bits/stdc++.h>
using namespace std;

int num[1005];
int answer, a, b, c, d, n, i;

bool find()
{
	for (a = n - 1; a >= 0; --a)
	{
		for (b = n - 1; b > 1; --b)
		{
			if (a == b)	continue;
			answer = num[a] - num[b];
			for (c = 0, d = b - 1; c < d;)
			{
				if (num[c] + num[d] == answer) return true;
				else if (num[c] + num[d] < answer) ++c;
				else --d;
			}
		}
	}
	return false;
}

int main()
{
	while (scanf("%d", &n), n)
	{
		for (i = 0; i < n; ++i) scanf("%d", &num[i]);
		sort(num, num + n);
		if (find()) printf("%d\n", num[a]);
		else puts("no solution");
	}
	return 0;
}

DIC新手避坑指南:压缩实验中的应变测量常见错误与数据校验技巧 本文为DIC技术新手提供了压缩实验中应变测量的全面避坑指南。文章系统梳理了从试样尺寸录入、散斑质量到数据后处理中应变方向与符号混淆、数据插值对齐等常见错误,并分享了基于MATLAB的自动化数据校验与可视化对比技巧,帮助建立可靠的实验数据分析SOP,确保DIC测量结果的准确性。 阅读详情

相关推荐

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get,set方法 1. 写在前面 我们主要看热力图的效果,区域绘制效怎么设置详细内容可以访问 openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap L

@必意玲 1万+

从零到一:在Linux系统上部署向日葵远程控制

本文详细介绍了在Linux系统上部署向日葵远程控制的完整流程,包括安装前的准备工作、下载与安装步骤、常见问题解决方案以及高级使用技巧。向日葵凭借其跨平台特性和出色的网络穿透能力,成为Linux用户远程控制的理想选择,特别适合远程办公和服务器维护等场景。

weixin_33739541的博客 471

STM32 RC522串口驱动程序 (简单直接)

rc522作为使用非常多的读写卡芯片,使用SPI芯片读写应用已经非常广了。但有些时候我们只有串口可以使用,或者我们觉得串口使用更加方便,那么就必须要编写串口的驱动程序。不过很难找到可以直接使用的串口程序。所以在此将我这边写好的串口驱动写好如下: 直接上代码 下面是RC522.C的驱动文件。支持读写卡号8位数据。rc522用的是stm32 的串口3,调试显示是串口1; #include "rc522.h" #include "delay.h" /////////////////////////////////

qq_42074368的博客 9001

UVa 10125 Sumsets (中途相遇法)

UVa 10125 Sumsets题目大意:给一个整数集合S,找出最大的d,使得a+b+c=d,其中a,b,c,d是S中的不同元素. (元素个数1<=n<=1000,元素大小-536870912<=x<=+536870911).题目分析:最直接的手段是直接枚举a,b,c,d,当然时间复杂度很高O(n^4). 但是若将四个数拆分成两两枚举,即先枚举a+b,储存起来,再枚举d-c,查找是否存在a+b

Continue 671

Trae编程工具Cline插件深度集成与Claude 3.7 API Key高级配置实战

本文详细介绍了如何在Trae编程工具中深度集成Cline插件并配置Claude 3.7 API Key的高级技巧。通过实战案例,展示了如何提升代码补全质量、实现多轮对话记忆及自定义代理设置,特别适合全栈工程师和需要私有化AI服务的团队。文章还涵盖了安装流程、API Key获取方式及企业级部署的最佳实践。

weixin_28829903的博客 436

Python爬虫(一)京东商品价格及详情页抓取

这是一个以http://item.jd.com/2957726.html为例的单网页抓取案例 import urllib.request; #载入urllib.request,用于获取页面html源代码 from pandas import Series; #载入series包 from pandas import DataFrame; #载入dataframe包 from bs4 impo

Data Proc 1万+

UVA 10125 - Sumsets

这个题有两种方法,一种是直接暴力搜索,但是也是有技巧的,先给数组排序,然后从最大的数开始搜索,如果能找到3个数和是这个数,直接结束循环,输出这个数。代码如下:(时间是1.618) #include #include using namespace std; int main() { //freopen("in.txt","r",stdin); int n,num[1010],fl

anqier0468的专栏 550

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

使用Python、Selenium实现问卷星自动填写,内含适配个人问卷的方法。

DaenCode的博客 3837

uva 10125 Sumsets

点击打开链接 题目意思: 给定一个集合s 以及集合的元素,要求找到最大的 d满足 d = a + b + c ,并且 a b c d互不相同 解题思路: 暴力枚举,3s足矣。注意要把元素相同情况给舍去即可。 代码: #include &amp;lt;algorithm&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstring&amp;gt; #...

我是传奇 236

软件可靠性测试与评价

本文系统介绍了软件可靠性工程的核心内容,包括可靠性概念、模型分类、测试方法和评价体系。重点解析了可靠性测试的三大步骤:定义运行剖面、设计测试用例和实施测试收集数据,并以智能安防系统为例说明具体应用。可靠性评价需结合业务场景,通过量化指标(MTBF、失效率等)和模型预测持续优化系统。文章强调可靠性需贯穿软件全生命周期,通过闭环反馈实现持续改进,为关键系统提供质量保障。

moton2017的博客 2050

YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入LCGA局部曲率引导注意力,保持局部稳定性的同时突出关键几何区域,含多种创新改进,促进YOLO26所有任务高效涨点

🔥本文提出LCGA(局部曲率引导注意力)模块,通过引入曲率信息改进YOLO26网络模型。LCGA在局部窗口内利用深度卷积构造曲率代理,调制标准窗口注意力,使模型更关注道路、边界等曲线型结构,提升遥感图像超分辨率中的几何保真度。相比普通注意力,LCGA能精准聚焦关键几何区域,减少边缘断裂和轮廓偏移,同时保持较低计算开销。实验表明LCGA显著提升性能,在UCMerced数据集上PSNR提升0.2148dB。文章提供了三种改进方案。

Ai缝合怪、助力小伙伴高效发论文 227

UVA 10125 Sumsets 折半枚举 + 二分

题意:就是给定一个整数序列,让你在这个序列中找到一个子集{a, b, c, d}吗,满足a + b + c = d且d最大,若不存在这样的集合输出 “no solution”; 题解:这题如果用暴力枚举,O(n^4),n最大为1000,必然TLE。所以要拆分枚举, a + b = c - d枚举 a , b 然后c - d的值二分搜索 和 a+ b比较直到 a+b=c-d;

退役ACMer 386

Python爬虫实战:百度贴吧帖子与评论抓取全攻略(附舆情分析技巧)

基础配置# 要爬取的贴吧名称(替换成自己需要的,比如“XX手游吧”)TIEBA_NAME = "XX手游"# 分页参数(每页50条帖子,可根据需求调整)PAGE_NUM = 3 # 爬取前3页帖子,共150条# 请求头(从浏览器复制自己的,更真实)Win64;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2388

UVA10125 Sumsets

嘟嘟嘟 很简单的折半搜索。 把式子变一下型,得到\(a + b = d - c\)。 然后枚举\(a, b\),存到\(map\)里,再枚举\(c, d\)就好了。 \(map\)以\(a,b\)两数之和为下标。为了判重,\(map\)的第二个参数是一个\(vector\),\(vector\)里面又存了两个数\(a, b\)。 这样先\(O(n ^ 2)\)跑一边\(a, b\)之和...

weixin_30399797的博客 120

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

uva 10125 Sumsets(搜索)

adjshfk

不慌不忙、不急不躁 1094

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

uva10125 - Sumsets

最简单的暴力 会超时 所以我们要想方设法的减少循环层数或者循环次数, a+b+c = d 那么a+b=d-c 这不是简单的等式变形 而是意味着我们循环的次数减少了。 我们对于d和c分别用一层循环, 对于a+b只用一层循环。 很妙的转变,,, 代码如下: #include #include using namespace std; int a[1010]; i

稻草人 1062

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

UVa10125--Sumsets(折半搜索)

题目大意:给出n个数字,求满足a+b+c=d最大的d 分析:先将等式变形为a+b=d-c,然后找出所有可能的a+b的值以及d-c的值,接着就直接匹配就行了。 代码: #include #include #include #include #include using namespace std; const int maxn = 1111; struct C {

Apple.Daily的专栏 423

uva 10125 - Sumsets

本来这几天不打算写题了,但是发现太无聊。       这题一开始直接dfs,果断超时,加个搜到就跳出,直接WA了,因为例如1 4 5 6 7这样数列,7 6 1       然后就a+b=d-c n^2的复杂度,不想用hash,于是就二分,结果忘记排序,WA了好多次……   /* author:jxy lang:C/C++ university:China,Xidian Univers

弱弱的jxy 486

UVa 11264 Coin Collector (选硬币&贪心好题)

思路: 1. 你肯定注意到了,面值最大的硬币c[n-1]必须要选。(反证:如果花了sum元却没有选中它,可知sum<c[n-1],于是用m+c[n-1]元去兑换可以得到一个更优解。) 2. 贪心的关键:假设S(i)是c[1]…c[i] 中那些被选中的货币的面值的和。那么一定有 S(i) < c[i+1]。 3. 所以可以构造一个这样的序列出来。按照2中所说,如果有 S(i-1) < c[i]且S(i) =S(i-1)+c[i]<c[i+1],那么c[i]将被选中。 完整代码:

AC,∑ndless 4699

UVa 256 Quirksome Squares (枚举||二次同余)

直接从0~9999枚举即可,因为等式右边一定是个完全平方数。 PS:此题可抽象成一个数论的问题:(部分解法参考了这篇文章) 求解4个二元二次丢番图方程 (x+y)^2=2mx+y,m=10^k / 2 = 2^(k-1)*5^(2k),k=1,2,3,4 令x+y=t,上式化为 t^2-2mt+(2m-1)y=0(由于0<=t^2<10^2k,所以0<=t<10^k) 进而 (t-m)^2=(1-2m)y+m^2 此方程的等价于求解二次同余式

AC,∑ndless 3440

UVa 10049 Self-describing Sequence (自描述序列&二分递推)

10049 - Self-describing Sequence Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=34&page=show_problem&problem=990 Solomon Golomb's self­des

AC,∑ndless 3143

UVa 108 Maximum Sum (贪心&最大子矩阵和)

108 - Maximum Sum Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=44 Background A problem that is simple

AC,∑ndless 2784

UVa 10057 A mid-summer night's dream. (二分&可以取哪些作为中位数?)

输出注意: 第一个数是最小的A,第二个数是在数列{Xn}中有多少个数可以是A,第三个数是在有多少个数可以是A。 完整代码:

AC,∑ndless 2495

Codeforces Round #105 (Div. 2) / 148A Insomnia cure (枚举 || 数论)

A. Insomnia cure http://codeforces.com/problemset/problem/148/A time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output

AC,∑ndless 2453

AOJ 0033 Ball (枚举)

题意: 有一个形似央视大楼(233)的筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B裤管或C裤管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B裤管和C裤管中的球从下往上标号递增。  输入: 第一行输入数据组数N。接下来N行为N组具体数据,每组数据中有10个整数,代表球的放入顺序。  输出: 对于每组数据,若策略存在,输出YES;若不存在,输

AC,∑ndless 2325
上一篇: SEERC 2004 / UVa 1330 City Game (扫描)
下一篇: Shanghai 2006 / UVa 1382 Distant Galaxy (枚举&扫描&动态维护)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值