Ⅰ.问题描述
P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Ⅱ.求解思路与推导
贪心与模拟的结合。第一个盒子只能与第二个盒子进行组合,之后的盒子都有两种组合方式(与前一个盒子或者后一个)。只需要记录当前这堆和前一堆的状态,遍历数组,把需要吃掉的糖吃掉,这样就可以保证吃掉的糖最小。
6 1
1 6 1 2 0 4
1 0 1 2 0 4 6
1 0 1 0 0 4 6+2
1 0 1 0 0 4 6+2
1 0 1 0 0 1 6+2+3=11
Ⅲ.核心数据结构
#include <iostream>
using namespace std;
int main() {
long long ans=0;
int n, x, a[200001];
cin >> n >> x;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++) { //模拟,正着遍历
if (a[i] + a[i + 1] > x)
{
ans += a[i + 1] + a[i] - x; //吃后面的
a[i + 1] = x - a[i];
}
}
cout << ans;
return 0;
}