分割项链__蓝桥杯练习系统__C++实现__滑动窗口算法

分割项链__蓝桥杯练习系统__C++实现__滑动窗口算法


有很久没写过博客了,今天写个比较简单的算法试试水
#题目: 蓝桥杯练习系统

问题描述

两个强盗刚刚抢到一条十分珍贵的珍珠项链,正在考虑如何分赃。由于他们不想破坏项链的美观,所以只想把项链分成两条连续的珍珠链。然而亲兄弟明算账,他们不希望因为分赃不均导致不必要的麻烦,所以他们希望两条珍珠链的重量尽量接近。于是他们找到了你,希望让你帮忙分赃。
  我们认为珍珠项链是由n颗不同的珍珠组成的,我们可以通过称重,分别称出每颗珍珠的重量(我们忽略连接珍珠的“链”的重量)。你要求的是每个人至少能得到多重的珍珠(即分赃少的那个人能得到多重的珍珠)。

输入格式

第一行一个整数n,表示这个珍珠项链有多少颗珍珠。第二行n个整数,顺时针给出每颗珍珠的重量wi。(你要注意的是,第一课珍珠和最后一颗珍珠是相连的)
输出格式
  一个整数,表示分赃少的那个人能得到多重的珍珠。

样例输入

7
1 2 3 4 3 2 1

样例输出

7

数据规模和约定

对于30%的数据,n<=200;
  对于60%的数据,n<=2000;
  对于100%的数据,n<=50000,0<wi<=1000。

#include <bits/stdc++.h>
#define LL long long int
using namespace std;
LL a[100000+7];
int main()
{
    LL sum=0,cnt=0,ans=0,n;
    cin>>n;
    for(LL i=0;i<n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    const LL flag=sum/2;
    LL i=0,j=0;
    cnt=a[0];
    while(i<n)
    {
        if(cnt<flag)
        {
            if(j==n-1)
            {
                j=0;
            }
            else
            {
                j++;
            }
            cnt+=a[j];
        }
        else
        {
            cnt-=a[i];
            i++;
        }
        ans=max(ans,min(cnt,sum-cnt));
        //cout<<"i="<<i<<",j="<<j<<" ";
        //cout<<ans<<endl;

    }
    cout<<ans<<endl;
    return 0;
}

/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值