第十五届蓝桥杯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;
}
相关推荐
Q741_1471 小时前
C++ 位运算 高频面试考点 力扣 面试题 17.19. 消失的两个数字 题解 每日一题
c++·算法·leetcode·面试·位运算
初圣魔门首席弟子1 小时前
C++ STL string(字符串)学习笔记
c++·笔记·学习
AA陈超2 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P04-12 可缩放浮点数的曲线表
c++·游戏·ue5·游戏引擎·虚幻
旭意2 小时前
C++微基础备战蓝桥杯之数组篇10.1
开发语言·c++·蓝桥杯
青草地溪水旁3 小时前
VSCode C/C++ 构建任务配置文件 `tasks.json` 全字段深度解析
c语言·c++·vscode
代码改善世界3 小时前
【C语言操作符终极指南】万字总结:从二进制到表达式求值,全方位解析+避坑指南
c语言
迪丽热爱3 小时前
【练】C程序设计-01程序设计和C语言
c语言·开发语言
爱和冰阔落5 小时前
C++模板进阶 非类型模板参数 模板的特化 分离编译的深入探索
c++·面试·编译原理·模板
charlie11451419111 小时前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
楼田莉子11 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习