Codeforces 892B Wrath (递推)

来源:互联网 发布:.top域名为什么便宜 编辑:程序博客网 时间:2024/06/03 18:11

题目链接:点击打开链接

题目大意:每个人手里都有一个武器,武器的长度决定他们可以杀死前面多少个人的人数,只要铃声响起就可以开始刺杀,问铃声落下后,还有多少人活着?

解题思路:一开始我用暴力去写,抱着试试的心态,结果意料之中的TLE,然后还是死磕着从左往右遍历,但是想不出,然后想着从右往左,依次遍历,根据题意,最右边的人一定不会死,所有从他手里的武器的长度入手,开个变量依次维护可刺杀人数的最大值,即:更新武器可以达到的最大长度

代码如下:

#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int maxn=1e6;int n,sum;ll a[maxn];int main(){    while(cin>>n)    {        int i,j;        sum=0;        for(i=0; i<n; i++)        {            cin>>a[i];        }        if(a[n-1]>=n)        {            sum=1;            cout<<sum<<endl;            continue;        }        ll len=-1;        for(i=n-1; i>=0; i--)        {            ll cnt=a[i];            if(len>=0) a[i]=-1;    //由右到左递推出能刺杀的最大值,依次维护            len=max(len,cnt);            len--;        }        for(i=0; i<n; i++)        {            if(a[i]!=-1)                sum++;        }        cout<<sum<<endl;    }    return 0;}




~step by step

原创粉丝点击