第十五届蓝桥杯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;
}
相关推荐
咔咔咔的15 小时前
1930. 长度为 3 的不同回文子序列
c++
Cinema KI20 小时前
吃透C++继承:不止是代码复用,更是面向对象设计的底层思维
c++
Dream it possible!1 天前
LeetCode 面试经典 150_二叉搜索树_二叉搜索树中第 K 小的元素(86_230_C++_中等)
c++·leetcode·面试
玩转C语言和数据结构1 天前
C语言编程入门攻略(最新学习路线,适合新手小白)
c语言·c语言入门·c语言下载·c语言知识点总结·c语言自学·c语言教程·c语言怎么学
Bona Sun1 天前
单片机手搓掌上游戏机(十四)—pico运行fc模拟器之电路连接
c语言·c++·单片机·游戏机
oioihoii1 天前
性能提升11.4%!C++ Vector的reserve()方法让我大吃一惊
开发语言·c++
小狗爱吃黄桃罐头1 天前
《C++ Primer Plus》模板类 Template 课本实验
c++
无限进步_1 天前
C语言数组元素删除算法详解:从基础实现到性能优化
c语言·开发语言·windows·git·算法·github·visual studio
松涛和鸣1 天前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
口袋物联1 天前
设计模式之适配器模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·适配器模式