# [pieces]吃甘蔗——两端定个数元素和最大问题

## 题目描述

1根甘蔗共有N段，美味度为a[1…N]，Sophie想要吃掉其中L段，并且甘蔗只能从2头开始吃。

# 几种思路

## 前缀和法

#include <iostream>
using namespace std;
#define MAXN (int)1e5 + 20

long long n, l;
long long a[MAXN], b[MAXN];

void init()
{
cin >> n >> l;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = b[i-1] + a[i];
}
}

void solve()
{
long long ans = 0, tmp = 0;
for (int i = 0; i <= l; i++)
{
tmp = b[i] + b[n]-b[n-l+i];
if (tmp > ans)
ans = tmp;
}
cout << ans << endl;
}

int main()
{
init();
solve();
}



## 三种仅求解段和的方法

### 在数组两端滚动

//Allen Lee
#include <iostream>
#include <algorithm>
using namespace std;
void solve()
{
int n, l, case_num = 1;
cin >> n >> l;
long long singleBite = 0;
long long sugarCane[100005] = {0}, bites = 0;
for (int i = 0; i < n; i++)
{
cin >> sugarCane[i];
if (bites < l)
{
singleBite += sugarCane[i];
bites++;
}
}
long long res = singleBite;
for (int i = 1; i <= l; i++)
{
singleBite -= sugarCane[l - i];
singleBite += sugarCane[n - i];
if (singleBite > res)
{
res = singleBite;
}
}
cout << res << endl;
return;
}
int main()
{
solve1();
return 0;
}


### 拼接数组中段法

//Neptune Yang
#include<iostream>
#include<vector>
using namespace std;

int main()
{
long long max = 0, sum = 0;
int N, L;
cin >> N >> L;
vector<int> a;
a.resize(2 * N);

for (int i = 0;i < N;i++)
{
cin >> a[i];
}
for (int i = 0;i < N;i++)//将原组复制两遍拼接在一起，那么法一中的
{
a[N + i] = a[i];
}
for (int i = 0; i < L; i++)
{
sum += a[2 * N - 1 - i];
max = sum;
}
for (int k = 0;k < L;k++)
{
sum += a[N + k] - a[N - L + k];
max = (sum > max) ? sum : max;
}
cout << max;
}


### 单中段互补法

#include <iostream>
#include <vector>
using namespace std;

int main()
{
int n, l;
vector<int> num;
long long ans = 0, tmp = 0, sum = 0;
cin >> n >> l;
num.resize(n);
for (int i = 0; i < n; ++i)
{
cin >> num[i];
sum += num[i];
if (i == n-l-1)
tmp = sum;
}
ans = sum - tmp;
for (int i = 0; i < l; ++i)
{
tmp +=  (num[i + n - l] - num[i]);
ans = max(sum - tmp, ans);
}
cout << ans << endl;
return 0;
}


# some trivia

• 不要尝试列举一个过大的数组。不论是内容还是个数
• vector比C数组、string比C字符串的优越性不是一星半点
• 分支快于三目运算符，快于max函数。
• 一次比较时使用分支（由于不太稳定，有时三目也是很不错的选择）
• 有计算(尤其像这个题数据比较大)的时候，传参会相对较慢，所以应该使用max函数

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客