题目背景
在“NEIMARK”这座看似普通的IT校园深处,昏暗的走廊尽头传来铿锵的脚步声——又是一场生死未卜的编程较量。教练的声音像夜半敲门般,带着不容置疑的威严和淡淡嘲讽:“这里,没有旁观者,只有强者与被淘汰者。”
故事引子与角色设定
你以为这只是又一场平凡的集训?别傻了。 地点:NEIMARK培训中心,传说这里隐藏着通往巅峰的秘密。 对象:参与者们在各自的座位前如同幽灵般潜伏,每个人的身上都刻着一个数字——他们的技术水平 ai。 教练:神秘而冷酷,唯有“强队”才能获得他那仿佛能洞悉人心的赞许。
悬念规则:何谓“强队”?
在这片充斥代码与不眠夜的战场上,队伍的“强度”被定义为: 强度 = 队员数量 × 队伍中最低技能值 换句话说,即便眼前有天赋异禀的高手,只要最弱之环拖了后腿,整个队伍就会陷入万丈深渊。教练的任务: 找出能够“幸存”——也就是“强度”至少达到 x 的那些队伍。
核心任务
参加者:共有 n 位学生,每位的技能分别记作 a₁, a₂, …, aₙ。
分组要求: 每个队伍至少一人; 所有学生必须恪守“军令”,各就各位,不能落单。
目标:在最黑暗的夜晚,教练嗜血般地冷笑:“我想看见最多的强队——告诉我,能有多少支队伍能存活到明天?”
输入格式
n x —— 学生数 n (1 ≤ n ≤ 2·10⁵),强度阈值 x (1 ≤ x ≤ 10⁹)
a₁ a₂ … aₙ —— n 位学生的技能值 (1 ≤ aᵢ ≤ 10⁹)
输出格式
输出一个整数——在教练的残酷审判下,最多能组成多少支“强队”。
输入数据
100 1314
1 100 500 655 115 26 760 282 251 229 143 755 105 693 759 914 559 90 605 433 33 31 96 224 239 518 617 28 575 204 734 666 719 559 430 226 460 604 285 829 891 7 778 826 164 715 433 349 285 160 221 981 782 345 105 95 390 100 368 868 353 619 271 827 45 748 471 550 128 997 945 388 81 566 301 850 644 634 907 883 371 592 197 722 72 47 678 234 792 297 82 876 239 888 104 390 285 465 651 855 374 167 380
解析解代码实现
排序完了再用贪心,理解题目大概意思就是让满足成队条件的队伍中每一个队伍包含的人数尽可能少,这样的话成对数目就会更多,那我们就可以让实力较强的人在一组,让他们“更快”地成组,接着再选剩下的成员里面实力较强的成组,避免出现实力较低的成员和实力较高的成员成组导致“浪费”。从大到小,贪心,满足就成组并处理剩下的成员,不满足就继续找人组队直至符合条件或没有成员可以组队。代码如下:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in);
int n = scanner.nextInt();
int x = scanner.nextInt();
int[] skills = new int[n];
for (int i = 0; i < n; i++) {
skills[i] = scanner.nextInt();
}
// 排序技能值(倒序)
Arrays.sort(skills);
int count = 0; // 记录符合条件的强队数量
int i = n - 1; // 从最强的学生开始
int last=n-1;
while (i >= 0) {
int teamSize = last - i+1; // 当前队伍的规模
int minSkill = skills[i]; // 当前队伍中最弱队员的技能值
int strength = teamSize * minSkill;
if (strength >= x) {
// 如果强度大于等于阈值,则成立一个强队
count++;
i--; // 移动到下一个队伍
last=i;
} else {
// 如果强度小于阈值,队伍无法组成,跳过最弱队员
i--;
}
}
// 输出符合条件的强队数量
System.out.println(count);
}
}