news 2026/4/29 15:05:28

核心代码编程-最大化游戏试玩资格分发-100分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
核心代码编程-最大化游戏试玩资格分发-100分

题目描述: 新研发了一台游戏设备可以面向用户接受试玩。现有n个试玩申请,每个试玩有开始时间和结束时间。
作为协调员,为了能让更多的人体验到游戏,你需要对试玩申请进行选择,使得:
1.任意两个被选中的试玩时间不重叠。
2.任意两个被选中的试玩时间允许连续,例如[2,3]和[3,4]认为是可以都被安排的。
3.被安排的试玩数量最大化
请问最多能安排多少场试玩?
输入:
第一行:一个整数n(1sn≤10°),表示试玩申请数量
第二行:是一个长度为n的数组,数组的每个元素为两个整数 start和end (0 s start < end ≤ 10°),表示试玩的开始和结束时间
输出:
一个整数,表示最多能安排的试玩数量
补充说明:
示例1
输入:3,[[1.5].[2.3].[4.6]]
输出:2
说明:选择玩家[2,3],[4,6],共2位
如果选择[1,5]则跟其他的时间冲突,则只有1位不满足最多玩家的要求
示例2
输入:5,[[1.2],[3,4], [5,6],[7,8], [9, 101]
输出:5
说明:共有5个试玩申请,且时间都不重合,允许连续,因此最多可以安排5个试玩。
示例3
输入: 1,[[1. 5]]
输出:1
说明: 只有一个试玩申请,直接安排
示例4
输入:3,[[1.5].[2,4].[3.6]]
输出:1
说明: 所有试玩时间都冲突,只能安排一场

贪心算法解决方案

这是一个经典的活动选择问题(Activity Selection Problem),使用贪心算法解决。核心策略是优先选择结束时间最早的活动,为后续活动留出更多时间。算法步骤如下:

  1. 按结束时间升序排序所有活动
  2. 选择结束时间最早的活动
  3. 从剩余活动中选择第一个开始时间≥上次选择结束时间的活动
  4. 重复步骤3直到遍历完所有活动

时间复杂度:$O(n \log n)$(排序主导)


C语言实现

#include <stdlib.h> int cmp(const void *a, const void *b) { int *x = *(int **)a, *y = *(int **)b; return x[1] - y[1]; } int maxEvents(int n, int** intervals) { qsort(intervals, n, sizeof(int*), cmp); int count = 0, lastEnd = -1; for (int i = 0; i < n; i++) { if (intervals[i][0] >= lastEnd) { count++; lastEnd = intervals[i][1]; } } return count; }

C++实现

#include <vector> #include <algorithm> using namespace std; int maxEvents(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; }); int count = 0, lastEnd = -1; for (auto& itv : intervals) { if (itv[0] >= lastEnd) { count++; lastEnd = itv[1]; } } return count; }

JavaScript实现

function maxEvents(intervals) { intervals.sort((a, b) => a[1] - b[1]); let count = 0, lastEnd = -1; for (const [start, end] of intervals) { if (start >= lastEnd) { count++; lastEnd = end; } } return count; }

Java实现

import java.util.Arrays; public class Solution { public int maxEvents(int[][] intervals) { Arrays.sort(intervals, (a, b) -> a[1] - b[1]); int count = 0, lastEnd = -1; for (int[] itv : intervals) { if (itv[0] >= lastEnd) { count++; lastEnd = itv[1]; } } return count; } }

Go实现

import "sort" func maxEvents(intervals [][]int) int { sort.Slice(intervals, func(i, j int) bool { return intervals[i][1] < intervals[j][1] }) count, lastEnd := 0, -1 for _, itv := range intervals { if itv[0] >= lastEnd { count++ lastEnd = itv[1] } } return count }

Python实现

def maxEvents(intervals): intervals.sort(key=lambda x: x[1]) count, last_end = 0, -1 for start, end in intervals: if start >= last_end: count += 1 last_end = end return count

所有实现均遵循以下原则:

  1. 按结束时间升序排序
  2. 贪心选择兼容活动
  3. 时间复杂度 $O(n \log n)$
  4. 空间复杂度 $O(1)$(除排序外)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 15:04:33

手把手教你组装BUFF67 V3 R2:从PCB到蓝牙5.2双模键盘的完整避坑指南

手把手教你组装BUFF67 V3 R2&#xff1a;从PCB到蓝牙5.2双模键盘的完整避坑指南 第一次接触机械键盘DIY的朋友们&#xff0c;看到BUFF67 V3 R2套件时可能会既兴奋又忐忑。这款支持蓝牙5.2双模和热插拔的60%布局键盘&#xff0c;凭借其出色的可玩性和稳定的无线性能&#xff0c;…

作者头像 李华
网站建设 2026/4/29 14:59:28

成年人最廉价的错觉:靠“好说话”换取尊重

上周三晚上快十一点&#xff0c;我在航天桥附近的一个烤串店&#xff0c;碰见了以前团队里的小林。 小林是个性格特温和的架构师&#xff0c;平时在组里出了名的“好说话”。那天他坐在角落里&#xff0c;面前摆着几瓶空啤酒&#xff0c;眼圈通红。 我坐过去陪他喝了两杯。他…

作者头像 李华