P3817. 小A的糖果

考点

  • 贪心

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int LEN = 1e5 + 50;

ll arr[LEN], pivot, ans;

void f(ll &pre, ll &nxt)
{
ll sum = pre + nxt, diff = sum - pivot;
if (diff <= 0)
return;
nxt -= diff;
if (nxt < 0)
{
pre += nxt;
nxt = 0;
}
ans += sum - (pre + nxt);
}

int main()
{
int n;
cin >> n >> pivot;
for (int i = 0; i < n; ++i)
cin >> arr[i];
for (int i = 0; i < n - 1; ++i)
f(arr[i], arr[i + 1]);
cout << ans;
return 0;
}

思路

每次两两比较时,只吃后面那盒;如果后面那盒吃成了负数,再从前面那盒拿糖

因为根据题眼任意两个相邻,当前的后面那盒糖会继续被下次比较使用,尽可能降低它的糖数可减少后续的开销

记得开long long