atcoder Equal Cut

Time limit : 2sec / Memory limit : 1024MB

Score : 600 points

Problem Statement

Snuke has an integer sequence A of length N.

He will make three cuts in A and divide it into four (non-empty) contiguous subsequences B,C,D and E. The positions of the cuts can be freely chosen.

Let P,Q,R,S be the sums of the elements in B,C,D,E, respectively. Snuke is happier when the absolute difference of the maximum and the minimum among P,Q,R,S is smaller. Find the minimum possible absolute difference of the maximum and the minimum among P,Q,R,S.

Constraints

  • 4≤N≤2×105
  • 1≤Ai≤109
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A1 A2  AN

Output

Find the minimum possible absolute difference of the maximum and the minimum among P,Q,R,S.


Sample Input 1

Copy
5
3 2 4 1 2

Sample Output 1

Copy
2

If we divide A as B,C,D,E=(3),(2),(4),(1,2), then P=3,Q=2,R=4,S=1+2=3. Here, the maximum and the minimum among P,Q,R,S are 4 and 2, with the absolute difference of 2. We cannot make the absolute difference of the maximum and the minimum less than 2, so the answer is 2.


Sample Input 2

Copy
10
10 71 84 33 6 47 23 25 52 64

Sample Output 2

Copy
36

Sample Input 3

Copy
7
1 2 3 1000000000 4 5 6

Sample Output 3

Copy
999999994

这题的意思是给你一个个序列,要你将这个序列分成4段(每段的元素连续),这四段每段进行累加得到4个累加和,求(最大累加和减去最小累加和)所生成的值的最小值


这题的方法是在直接枚举中间分界点,然后再在用相同的方法去枚举,如果用传统的方式,这个方法会超时。所以要进行优化界限,我们会发现界限一和界限三其实有很多重复的部分,那就是他一个会从1枚举到中间界限,另一个会从中间界限枚举到n,这些步骤中会有很多重复,所以我们只优化即可,在实时刷新结果即可以,详细见代码

#include <cstdio>
#include <algorithm>
using namespace std;
long long v[200005],k[200005];
int main() {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&v[i]);
        k[i]=k[i-1]+v[i];
    }
    long long p[5]={0,0,0,0,0},mmin=0x7fffffff;
    int l=1,r=3;
    for(int i=2;i<n-1;i++){
        while (l<i&&abs(k[l]-k[0]-(k[i]-k[l]))>=abs(k[l+1]-k[0]-(k[i]-k[l+1]))) {
            l++;
        }
        while (r<n&&abs(k[r]-k[i]-(k[n]-k[r]))>=abs(k[r+1]-k[i]-(k[n]-k[r+1]))) {
            r++;
        }
        p[1]=k[l]-k[0];
        p[2]=k[i]-k[l];
        p[3]=k[r]-k[i];
        p[4]=k[n]-k[r];
        mmin=min(mmin,max(p[1],max(p[2], max(p[3],p[4])))-min(p[1], min(p[2], min(p[3], p[4]))));
    }
    printf("%lld\n",mmin);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中的isequal函数用于比较两个对象是否相等。该函数不考虑数据类型,只关注元素的值是否相等。当比较数值时,isequal函数不考虑数据类型,例如逻辑真和1、字母A和65,它们都视为相等。然而,不同的NaNs不相等,因此包含NaN的数组都不相等。如果想将NaN视为相等,可以使用isequalwithequalnans函数。对于元胞数组和结构体,isequal函数会循环比较它们的内容。如果所有元素的值都相等,则isequal函数返回逻辑1(真)。 在转化为C语言时,可以通过编写对应的代码来模拟isequal函数的运算。根据需要的功能,可以使用比较运算符(例如==)来比较数值,使用循环或递归来比较元胞数组和结构体的内容。同时,需要注意C语言和MATLAB的语法和数据类型的差异,确保代码的正确性和可移植性。 请注意,MATLAB中的isequal函数有一些特殊情况的处理,如对NaN的处理,以及对逻辑真和数值1的等价视为相等。在C语言中需要根据具体需求进行相应的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MATLAB中isequal函数转化为C语言,有项目算法使用matlab中isequal函数进行运算,这里需要将转化为C语言](https://download.csdn.net/download/li171049/88279963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MATLAB中的isequal函数的用法](https://blog.csdn.net/xuxinrk/article/details/80367911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值