- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
java解法
- 解题思路
- 问题要求从一组演出日程中选择最多的演出,满足以下条件:
每场演出有开始时间和持续时间。
两场相邻演出之间至少需要 15分钟 的间隔时间。
算法采用贪心策略:
按演出结束时间升序排序,优先安排结束时间较早的演出。
遍历排序后的日程表,依次选择满足条件的演出:
当前演出开始时间与上一场已选演出的结束时间间隔至少为15分钟。
返回选择的演出总数。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numPerformances = scanner.nextInt();
int[][] schedule = new int[numPerformances][2];
for (int i = 0; i < numPerformances; i++) {
int startTime = scanner.nextInt();
int duration = scanner.nextInt();
schedule[i][0] = startTime;
schedule[i][1] = startTime + duration;
}
System.out.println(maxPerformances(schedule));
}
public static int maxPerformances(int[][] schedule) {
Arrays.sort(schedule, (a, b) -> Integer.compare(a[1], b[1]));
int count = 1;
int lastEndTime = schedule[0][1];
for (int i = 1; i < schedule.length; i++) {
if (schedule[i][0] - lastEndTime >= 15) {
count++;
lastEndTime = schedule[i][1];
}
}
return count;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
C++解法
- 解题思路
- 这段代码实现了一个贪心算法,用来从多个区间中选择最多的非重叠区间,满足每个区间之间至少有 15分钟 的间隔。
具体思路如下:
输入区间:
输入包含 sz 个区间,每个区间由开始时间 start 和持续时间 duration 构成。
计算每个区间的结束时间 end = start + duration。
按结束时间排序:
使用贪心策略,优先选择结束时间较早的区间,以便为后续区间留出更多选择空间。
选择区间:
遍历排序后的区间,依次判断当前区间的开始时间与上一个选中区间的结束时间是否满足间隔时间 >= 15分钟。
如果满足条件,则选择该区间并更新上一次选中区间的结束时间。
输出结果:
最终输出选中区间的数量
#include
#include
#include
using namespace std;
bool cmp(const vector<int>& x, const vector<int>& y) {
return x[1] < y[1];
}
int main() {
int sz;
cin >> sz;
vector<vector<int>> rng(sz, vector<int>(2));
for (int i = 0; i < sz; i++) {
cin >> rng[i][0] >> rng[i][1];
rng[i][1] += rng[i][0];
}
sort(rng.begin(), rng.end(), cmp);
int tmp = rng[0][1];
int res = 1;
for (int i = 1; i < sz; i++) {
int lft = rng[i][0];
int rgt = rng[i][1];
if (lft - tmp >= 15) {
res++;
tmp = rgt;
}
}
cout << res << endl;
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: