1 条题解

  • 0
    @ 2026-10-18 20:02:44

    思路推导

    读完题目,能发现一件事:比我们选中的数更小的值,不会影响能不能完成任务,我们只需要考虑大于等于它的数字。

    把全部数字排序、去重之后,我们就得到从小到大的各个高度。我们的起点就是选中的那个数。

    题目规则要求,每往上提升高度,需要消耗一定数量。而且在当前高度,手里可用的数量最多只能等于当前高度的值。

    那我们就想到,可以一层一层从起点往更高的高度检查。每到下一个高度,算出跨过去最少需要多少资源。如果需要的资源超过当前高度能提供的上限,就做不到,答案是 NO。

    只要所有更高的层级全部都满足这个限制条件,说明可以完成任务,输出 YES。


    代码

    #include <stdio.h>
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t--)
        {
            int n, k;
            scanf("%d %d", &n, &k);
            long long h[200005];
            long long x = 0;
            for(int i = 1; i <= n; i++)
            {
                scanf("%lld", &h[i]);
                if(i == k)
                {
                    x = h[i];
                }
            }
            
            // 冒泡排序
            for(int i = 1; i <= n; i++)
            {
                for(int j = 1; j <= n - i; j++)
                {
                    if(h[j] > h[j+1])
                    {
                        long long temp = h[j];
                        h[j] = h[j+1];
                        h[j+1] = temp;
                    }
                }
            }
            
            // 去重
            long long a[200005];
            int lena = 0;
            for(int i = 1; i <= n; i++)
            {
                if(h[i] != h[i - 1])
                {
                    a[lena++] = h[i];
                }
            }
            
            // 找到起点的位置
            int wei = 0;
            for(int i = 0; i < lena; i++)
            {
                if(a[i] == x)
                {
                    wei = i;
                }
            }
            
            int xx = lena;
            long long chu = 1;
            int flag = 1;
            
            // 逐层向上检查
            for(int i = wei + 1; i < xx; i++)
            {
                long long cha = a[i] - a[i - 1];
                if(chu + cha - 1 > a[i - 1])
                {
                    flag = 0;
                    break;
                }
                chu += cha;
            }
            
            if(flag)
            {
                printf("YES\n");
            }
            else
            {
                printf("NO\n");
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1239
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    136
    已通过
    20
    上传者