第十五届蓝桥杯C/C++B组拔河问题详解

解题思路

这道题目的难点在于枚举所有区间,并且区间不能重合,那么这样感觉就很难了。但是用下面这种方法就会好很多。

我们只需要将左边的所有区间的各种和放在一个set中,然后我们在枚举右边的所有区间的和去和它进行比较,然后求出差值,如果差值比最小的小,那么就更新答案,那么我们只需要去从左边到右边移动线的位置就行。

代码实现

cpp 复制代码
#include<iostream>
#include<vector>
#include<iostream>
#include<vector>
#include<set>
using namespace std;
const int N=1e4;
int p[N];
long long sum[N];
typedef long long LL;
set<LL>a;
int main()
{
    ios::sync_with_stdio(false);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p[i];
		sum[i]=sum[i-1]+p[i];//前缀和
	}
    LL res=1e15;
    a.insert(1e15);//防止找不到比右边区间大的左边的
    a.insert(-1e15);//防止找不到比右边区间小的左边的
    for(int i=1;i<=n;i++)//枚举中间的线
    {
        for(int l=1;l<=i-1;l++)//枚举左边的所有区间
        {
            a.insert(sum[i-1]-sum[l-1]);//插入前面的区间[l,i-1];
        }       
        for(int r=i;r<=n;r++)
        {
            LL s=sum[r]-sum[i-1];//枚举右边的所有区间和
            auto it= a.lower_bound(s);//大于这个数的最小数
            res=min(res,(*it-s));
            it--;//找到小于这个数的最大数
            res=min(res,(s-*it));
        }
    }
    cout<<res;
    return 0;
}
相关推荐
水饺编程2 分钟前
编程数学:三角函数基础01,直角三角函数
c语言·c++·windows·visual studio
LuminousCPP4 分钟前
数据结构-排序(一):基础排序算法横向对比|冒泡、插入、希尔、堆与双向选择,详解二分 / Knuth 增量
c语言·数据结构·笔记·算法·排序算法
初願致夕霞6 分钟前
C/C++传统程序内存分布(代码实测)
java·c语言·c++
牛油果子哥q7 分钟前
C++对接LLM完整工程:异步HTTP请求、JSON解析、超时容错、重连兜底
c++·http·json
会周易的程序员39 分钟前
aiDgeController软PLC控制通讯协议文档
c++·物联网·网关·iot·ipc·进程间通讯
(Charon)1 小时前
【C++】网络缓冲区设计(四):epoll + Reactor中Buffer的完整读写流程
开发语言·c++
csdn_aspnet2 小时前
C++ 未排序数组中第 k 个最小/最大元素 | 最坏情况下的线性时间
数据结构·c++·算法
wuyk5552 小时前
从零吃透 MQTT 通信|第 6 章 MQTT 主题、过滤器、通配符、订阅管理、拒收机制详解与代码实现
c语言·stm32·学习
phltxy11 小时前
C语言操作符详解
java·c语言·算法
RuoZoe11 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++