- 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
java解法
我们需要根据给定的多个时间段(每个时间段由开始时间和持续时间给出)来安排最多的电视节目。
关键点是:如果两个节目之间的时间间隔小于15分钟,则不能同时播放。我们需要计算最多可以安排多少个节目。
给定的节目时间段以开始时间和持续时间为输入,我们需要计算每个节目的结束时间。
贪心算法:
我们可以使用贪心策略来解决这个问题:
首先,按照节目的结束时间升序排序,优先选择结束时间较早的节目。
然后,通过遍历排序后的节目的时间段,选择每个结束时间早且与之前选择的节目之间的间隔大于等于15分钟的节目。
贪心选择的原则是每次选择结束时间最早且与前一个节目的结束时间间隔较大的节目,以便为后面的节目腾出更多的时间。
具体步骤:
解析输入并存储每个节目的开始时间和结束时间。
对节目时间段按照结束时间排序。
遍历排序后的节目列表,如果当前节目和之前选择的节目之间的间隔大于等于15分钟,则选择该节目。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int numShows = sc.nextInt();
int[][] timeSlots = new int[numShows][2];
for (int i = 0; i < numShows; i++) {
int start = sc.nextInt();
int length = sc.nextInt();
timeSlots[i][0] = start;
timeSlots[i][1] = start + length;
}
System.out.println(maxShows(timeSlots));
}
public static int maxShows(int[][] timeSlots) {
Arrays.sort(timeSlots, (slot1, slot2) -> Integer.compare(slot1[1], slot2[1]));
int maxShows = 1;
int prevEndTime = timeSlots[0][1];
for (int i = 1; i < timeSlots.length; i++) {
if (timeSlots[i][0] - prevEndTime >= 15) {
maxShows++;
prevEndTime = timeSlots[i][1];
}
}
return maxShows;
}
}
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
C++解法
给定一组时间区间,表示多个活动或节目的开始时间和持续时间。我们需要计算最多可以安排多少个节目,且每个节目之间的时间间隔必须大于等于15分钟。
问题的本质是:如何最大化选择活动,使得每次选择的活动的结束时间和下一个活动的开始时间之间有足够的间隔。
贪心算法:
排序:首先,按活动的结束时间(开始时间 + 持续时间)升序排列。这样,我们可以优先选择结束时间最早的活动。
选择活动:选择第一个活动后,遍历剩下的活动,若当前活动的开始时间距离上一个已选择活动的结束时间至少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
- 47
- 48
- 49
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"}">
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: