• B


    Hands that shed innocent blood!

    There are n guilty people in a line, the i-th of them holds a claw with length Li. The bell rings and every person kills some of people in front of him. All people kill others at the same time. Namely, the i-th person kills the j-th person if and only if j < i and j ≥ i - Li.

    You are given lengths of the claws. You need to find the total number of alive people after the bell rings.

    Input
    The first line contains one integer n (1 ≤ n ≤ 106) — the number of guilty people.

    Second line contains n space-separated integers L1, L2, …, Ln (0 ≤ Li ≤ 109), where Li is the length of the i-th person’s claw.

    Output
    Print one integer — the total number of alive people after the bell rings.

    Examples
    Input
    4
    0 1 0 10
    Output
    1
    Input
    2
    0 0
    Output
    2
    Input
    10
    1 1 3 0 0 0 2 1 0 3
    Output
    3
    Note
    In first sample the last person kills everyone in front of him.

    题意:排队,每个人可以杀死自己攻击范围内且在自己前面的人(被杀了还可以继续杀人),求活下来的人。
    思路:一开始暴力,毫无悬念的超时了,看了下网上的代码,发现思路其实可以很优化,只要计算有多少人没有被攻击到即可。
    注意:从后往前枚举,方便找到每个人的攻击范围
    AC代码:

    #include <bits/stdc++.h>
    #define INF 1e9 + 5
    
    using namespace std;
    const int maxn = 1e6 + 5;
    int len[maxn];
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i = 1;i <= n;i++)
        {
            scanf("%d",&len[i]);
        }
        int Maxx = INF;
        int ans = 0;
        for(int i = n;i >= 1;i--)
        {
            if(i >= Maxx)//打不到他
            {
                ans++;
            }
            Maxx = min(Maxx,i - len[i]);
        }
        printf("%d
    ",n - ans);
        return 0;
    }
    
    

    暴力超时代码:

    #include <bits/stdc++.h>//超时代码
    
    using namespace std;
    const int maxn = 1e6 + 5;
    long long len[maxn];
    long long is_alive[maxn];
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i = 0;i < n;i++)
        {
            scanf("%lld",&len[i]);
        }
        for(int i = 0;i < n;i++)
        {
            is_alive[i] = 1;
        }
        for(int i = n - 1;i >= 0;i--)
        {
    
                    for(int k = i - 1;k >= i - len[i] && k >= 0;k--)
                    {
                        is_alive[k] = 0;
                    }
    
        }
        long long sum = 0;
        for(int i = 0;i < n;i++)
        {
            sum += is_alive[i];
        }
        printf("%lld",sum);
    }
    
  • 相关阅读:
    Bash的提示符
    小笨霖英语笔记本(5)
    什么是VLAN
    阅读笔记:双核心Opteron处理器
    小笨霖英语笔记本(4)
    搭乘CCNUMA快车
    得到tnsnames.ora文件的位置 zz
    关于64位Windows操作系统中的注册表 zz
    Temp.Misc
    HttpHandler HttpModule入门篇
  • 原文地址:https://www.cnblogs.com/tomjobs/p/10617583.html
Copyright © 2020-2023  润新知