hh的蓝桥杯每日一题--拔河

P10429 [蓝桥杯 2024 省 B] 拔河 - 洛谷

这个题目是用了前缀和

对于一个已排序 的数组,任意两个不同元素的差值的最小值一定出现在某两个相邻元素之间。

但是如果只用前缀和而不进行优化的话,则会造成超时的情况

一开始我只用的前缀和然后计算出每一段的连续长度和,然后在进行枚举,但是最后提交的时候发现只过了一个样例然后其他都是超时】

所以我就看了题解,发现其中一个的做法是,计算出每一长度的连续前缀和之后对其排序然后在其相邻的两个元素之间找差值最小值

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1010;
struct segment{
	ll sum;
	int l,r;
};
int n;
bool cmp(segment &a,segment &b)
{
	return a.sum<b.sum;
}

ll a[N];
ll s[N];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	
	vector<segment> seg;
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
		{
			seg.push_back({s[j]-s[i-1],i,j});
		}
	}
	
	sort(seg.begin(),seg.end(),cmp);
	
	int m=seg.size();
	ll ans=5e10;
	
	for(int i=0;i<m;i++)
	{
		for(int j=i+1;j<m;j++)
		{
			if(seg[j].sum-seg[i].sum>=ans)break;
			if(seg[i].r<seg[j].l||seg[j].r<seg[i].l)
			{
				ans=min(ans,seg[j].sum-seg[i].sum);
			 } 
		}
	} 
	
	cout<<ans<<endl;
	return 0;
}
相关推荐
网络安全-杰克3 分钟前
2026面试自动化测试面试题【含答案】
自动化测试·软件测试·面试·职场和发展
努力学算法的蒟蒻1 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
CodeSheep程序羊2 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
学历真的很重要2 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
hqyjzsb3 小时前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作
YuTaoShao5 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头5 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
网络安全-杰克6 小时前
Jmeter压力测试工具安装与使用
自动化测试·软件测试·测试工具·jmeter·职场和发展
June bug6 小时前
【PMP】敏捷Scrum实践
经验分享·职场和发展·学习方法·scrum
_OP_CHEN8 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc