题解:P13993 【MX-X19-T2】「LAOI-14」SPECIALZ
N1tr0us_Acid · · 题解
贪心题。
\texttt{Solution}
容易发现,我们在每一层只会踩两个格子,而那么我们只需要最小化这两个格子的和就行了。
我们在第
不难发现,我们现在只需要最小化每一层的
所以我们可以通过贪心的摆放当前层的
那么贪心就很显然了,这个机器人按这样走就可以使答案最小:
- 当前位置是
1 ,那么如果可以瞬移到第m 个位置,瞬移之,否则移到第2 个位置。 - 当前位置是
m ,那么如果可以瞬移到第1 个位置,瞬移之,否则移到第m - 1 个位置。 - 当前位置是
2 ,那么如果可以瞬移到第m 个位置,瞬移之,否则移到第1 个位置。 - 当前位置是
m - 1 ,那么如果可以瞬移到第1 个位置,瞬移之,否则移到第m 个位置。
如果你仔细看会发现,上面的
\texttt{Code}
按贪心思路模拟即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int n, m;
int ans;
int now = 1;
signed main(void) {
ios :: sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
ans = n;
for (int i = 1; i <= n; i ++) {
int k;
cin >> k;
int l = now - k, r = now + k;
l = max(l, 1ll), r = min(r, m);
int len = r - l + 1;
len = min(len, m);
ans += len;
if(len == m) {
if(now == m) now = 1;
else now = m;
}
else {
if(now == 1) now = 2;
else if(now == 2) now = 1;
else if(now == m) now = m - 1;
else if(now == m - 1) now = m;
}
}
cout << ans;
return 0;
}