当前位置: 首页 > news >正文

阿里算法岗 0530笔试真题 - 荆棘林的最优砍断计划

荆棘林的最优砍断计划

阿里算法岗 0530笔试 第一题

题目内容

林中共有n nn株荆棘,第i ii株的坚硬度为a i a_iai,宝刀的初始锋利度为K KK。拉布可以选择任意数量的荆棘,每株至多尝试一次,并以任意顺序依次尝试砍断。每次尝试遵循以下规则:

  • 若当前锋利度K KK满足K ≥ a i K \ge a_iKai,则该荆棘被成功砍断。
  • 无论成功与否,每次尝试结束后锋利度K KK都会永久减少1 11
    拉布可以放弃任意荆棘(放弃不消耗锋利度)。请计算在最优策略下,最多能成功砍断多少株荆棘。

输入描述

每个测试文件包含多组测试数据。第一行输入一个整数T TT1 ≤ T ≤ 10 5 1 \le T \le 10^51T105)表示数据组数,每组测试数据描述如下:
每组输入一行两个整数n , K n, Kn,K1 ≤ n ≤ 2 × 10 5 1 \le n \le 2 \times 10^51n2×1051 ≤ K ≤ 10 9 1 \le K \le 10^91K109)。
接下来一行输入n nn个整数a 1 , a 2 , … , a n a_1, a_2, \dots, a_na1,a2,,an1 ≤ a i ≤ 10 9 1 \le a_i \le 10^91ai109)。
保证所有测试数据的n nn之和不超过2 × 10 5 2 \times 10^52×105

输出描述

对于每组测试数据,输出一个整数,表示在最优策略下最多能成功砍断的荆棘数量。

样例1

输入

3 5 5 2 1 4 10 3 2 1 10 10 3 3 3 3 3

输出

4 0 1

题解和思路

思路

实现思路:贪心

  1. 按照优先砍锋利度高的,能砍就砍的策略去计算数量。
  2. 将荆棘降序排序,从大到小进行扫描,如果a[i] <= k,更新ans++, k--
  3. 最终ans就是能砍的最大数量。

C++

#include<bits/stdc++.h>usingnamespacestd;intmain(){ios_base::sync_with_stdio(false);cin.tie(nullptr);intT;cin>>T;while(T--){intn,k;cin>>n>>k;vector<int>a(n);for(inti=0;i<n;i++){cin>>a[i];}// 排序sort(a.begin(),a.end());intcount=0;for(inti=n-1;i>=0;i--){// 能砍断就砍if(a[i]<=k){k--;count++;}}cout<<count<<endl;}return0;}

Java

importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intT=sc.nextInt();while(T-->0){intn=sc.nextInt();intk=sc.nextInt();int[]a=newint[n];for(inti=0;i<n;i++){a[i]=sc.nextInt();}// 排序Arrays.sort(a);intcount=0;for(inti=n-1;i>=0;i--){// 能砍断就砍if(a[i]<=k){k--;count++;}}System.out.println(count);}sc.close();}}

python

T=int(input())for_inrange(T):n,k=map(int,input().split())a=list(map(int,input().split()))# 排序a.sort()count=0foriinrange(n-1,-1,-1):# 能砍断就砍ifa[i]<=k:k-=1count+=1print(count)print(count)

Javascript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});constlines=[];rl.on('line',line=>{lines.push(line);});rl.on('close',()=>{letidx=0;constT=Number(lines[idx++]);for(lett=0;t<T;t++){const[n,k0]=lines[idx++].split(' ').map(Number);letk=k0;consta=lines[idx++].split(' ').map(Number);// 排序a.sort((a,b)=>a-b);letcount=0;for(leti=n-1;i>=0;i--){// 能砍断就砍if(a[i]<=k){k--;count++;}}console.log(count);}});

Go

packagemainimport("fmt""sort")funcmain(){varTintfmt.Scan(&T)forT>0{T--varn,kintfmt.Scan(&n,&k)a:=make([]int,n)fori:=0;i<n;i++{fmt.Scan(&a[i])}// 排序sort.Ints(a)count:=0fori:=n-1;i>=0;i--{// 能砍断就砍ifa[i]<=k{k--count++}}fmt.Println(count)}}
http://www.cnnetsun.cn/news/2848722.html

相关文章:

  • i.MX 8XLite接口时序设计:从DDR、GPMI到外设的硬件实战指南
  • Adobe-GenP 3.0:设计师的创意解放工具,告别订阅制束缚
  • AutoDL GPU 云平台 Python 自动化 SDK — 实例开关机、创建释放、代码上传、远程执行,7行代码跑通全流程
  • i.MX 8QuadMax异构多核SoC:破解嵌入式系统性能、功耗与实时性三角难题
  • Flight Review:无人机飞行数据分析的终极解决方案
  • 遭遇DDoS攻击后如何快速分析攻击源?用IP离线库+威胁情报定位异常IP
  • ARM Cortex-M0+微控制器外设驱动与内存映射实战解析
  • 让Mac文件预览体验提升10倍的秘密武器:50+款QuickLook插件深度解析
  • MATLAB手写数字识别小工具:带界面、可绘图、能实时识别(含源码+论文)
  • 甲级乙级防火玻璃门适用场所区分,规范安装要求详解
  • 厨余/有害/可回收/其他四类垃圾图像数据集,含标准ImageFolder结构与可视化脚本
  • Kinetis KL14低功耗设计实战:从电气特性到睡眠模式深度解析
  • 5分钟快速上手:用jQuery.Marquee打造专业级滚动文字效果
  • 深入解析KL46微控制器ADC/DAC电气特性与通信接口设计
  • 老旧厂区防爆监控改造技术指南:合规设计、选型与施工要点
  • 甘肃地区防爆监控方案服务商梳理 + 技术选型、运维全指南
  • Moneta Markets亿汇:把工具可用性做扎实,新手更容易感受到的逻辑
  • 2026在线水印去除怎么做?在线水印去除方法与工具推荐
  • 华硕笔记本性能调控神器:5分钟掌握G-Helper轻量级控制工具
  • i.MX 8ULP模拟接口设计:从ADC/DAC/CMP电气特性到PCB实战
  • 终极指南:如何用League Akari开源工具包彻底改变你的英雄联盟游戏体验
  • 从数据手册到实战:基于Kinetis KL27的嵌入式低功耗设计深度解析
  • RAG系统评估:检索质量与生成质量的联合评测方法
  • 校园机房vDisk IDV云桌面建设方案价格参考
  • 世界杯投屏选哪个?当贝投屏免费低延迟实测
  • i.MX 6SoloX异构多核处理器实战:从架构解析到物联网网关开发
  • 多维聚合中的数据操纵:维度裁剪、语义计算与流式集成
  • 生产环境机器学习模型的持续生命力:监控、漂移检测与热更新实战
  • Navicat连不上MySQL?别慌!先检查这个服务是不是偷偷关了(附两种启动方法)
  • 你的论文署名规范吗?聊聊LaTeX中ORCID、邮箱、机构信息的排版美学与避坑指南