Codeforces 892 B. Wrath

不知道用没用算法,不过我读题都费劲!!!
不说我以前怎么理解的了,害怕误导…就说正确题意是什么样的吧
杀人只能杀该位置前面的!!!
然后一开始暴力,遍历所有可能,把要被杀的人全标记成死亡…数据太大,然后就超时了…辛辛苦苦写那么长时间代码,中途理解题意还那么困难。(老实人的笑容)
然后换思路,我也没看别人怎么想的,自己在闷着头想…无果,感觉自己也就那点水平,然后也没看别人的代码。就看了看其他人博客的思路…不知道哪为大佬写的,更新杀人区间,让我好像有点灵感,然后稀稀疏疏的写出来了,感觉不是很完美,但是就去交了,wa了好几次,然后在改改,慢慢思路完全就清晰了!!!然后就a出来了,哎…对比了一下和大佬们写的差不多

#include <iostream>
#include <algorithm>

using namespace std;

long a[1000066];

int main()
{
    long n;
    cin >> n;
    for(int i = 0; i < n; ++i)
        cin >> a[i];//样例输入,没啥好解释的。
        
    long kill_le = a[n-1];//最近做的题数据都好大,动不动就爆int,谨慎的我开了long...
    /*最后一个人能够杀人的距离*/
    
    int cnt = 1;/*表示存活人数,从后往前杀,最后一个人就是最后一个人了,没有人能够杀他*/
    
    for(int j = n-2; j >= 0; --j)//从倒数第二个人开始
    {
        if(kill_le == 0)//如果这个j后面的人,杀人的距离为0,那么这个人就活着,cnt++
            cnt++;
        kill_le = max(kill_le-1,a[j]);
        /*上面这一行说明,j能够杀死前面人的距离。
        因为有可能j后面杀人距离因为杀害j消耗了距离1之后还要比本身j的claw长度a[j]还要长,
        所以j虽然死了(;д;)但可以继承j后面那个人继续杀人的长度。如果不长的话就接着j
        的爪子杀人呗,所以取最大值。*/

	/*然后j--,kill_le是j能够杀人的距离,如果kill_le为0,j--也就能存活,也就是上面的cnt++;*/

    }
    cout << cnt;

    return 0;
}

写的有点流水账和啰嗦,我尽可能的把我的思路写出来了,如果还是不明白,绝对不是因为你笨。是我描述还不清数,写的还是不够透彻,或者我自己没办法清楚的说出来。若有错误,请见谅。

猜你喜欢

转载自blog.csdn.net/weixin_44031744/article/details/86530673