目录
题目:
题目描述:
有 n 个人排成一列,第 i 个人有长度为 的爪子,同时也意味着铃声响起,第 i 个人就可以杀掉前面(左边) 个人。问,铃声响后,有几人存活?
思路:
我们可以用一种贪心的思路,从后(右)往前(左)遍历,不妨设变量 ans 为最终存活人数,以及 cnt 为当前位置还剩下的爪子长度(后面人的爪子)
①如果 cnt > 0 ,说明当前这个人必死,同时 cnt--
②如果 cnt = 0 ,说明当前这个人能活,所以 ans++
除此之外,不管当前这个人是死是活,我们都应该将爪子长度更新为 max(之前的爪子剩下的长度 cnt ,当前人的爪子长度 )
思路有了,具体操作请看AC代码
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
int a[N];//每个人的爪子长度
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int cnt = a[n];//当前位置后面人的爪子能抓到的最大距离
int ans = 1;//活着的人数(最后一人必活)
for (int i = n - 1; i >= 1; i--)
{
if (cnt)
cnt--;
else
ans++;
cnt = max(cnt, a[i]);//更新为当前位置往前的最长爪子
}
cout << ans << '\n';
}
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
while (t--)
solve();
return 0;
}