1 条题解
-
0
思路推导
读完题目,能发现一件事:比我们选中的数更小的值,不会影响能不能完成任务,我们只需要考虑大于等于它的数字。
把全部数字排序、去重之后,我们就得到从小到大的各个高度。我们的起点就是选中的那个数。
题目规则要求,每往上提升高度,需要消耗一定数量。而且在当前高度,手里可用的数量最多只能等于当前高度的值。
那我们就想到,可以一层一层从起点往更高的高度检查。每到下一个高度,算出跨过去最少需要多少资源。如果需要的资源超过当前高度能提供的上限,就做不到,答案是
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
- 上传者