Lab5-贪心算法
发布时间: 2024-05-13 18:00:00截止时间: 2024-05-20 23:59:59当前时间:2024-05-13 19:23:54
练习题:
392959. 用最少数量的箭引爆气球 目前得分:100
277684. 最小延迟调度 目前得分:100
用最少数量的箭引爆气球
总提交数: 367次通过数: 212次通过率: 57.77%
内存限制: 10485760(BYTE)时间限制: 1000(MS)输入限制: 1000(行)输出限制: 1000(行)
题目描述
描述
有一些球形气球在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points,其中points[i]=[x_start,x_end]表示水平直径在x_start和x_end之间的气球。你不知道气球的确切y坐标。
一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为x_start,x_end,且满足x_start <= x <= x_end,则该气球会被引爆。可以射出的弓箭的数量没有限制。弓箭一旦被射出后,可以无限地前进。
输入:
第一行是一个整数N,表示气球的数目。
接下来的N行,每行为一个气球的开始和结束坐标
输出:
打印引爆所有气球所必须射出的最小弓箭数。
示例1:
输入:
4
10 16
2 8
1 6
7 12
输出:
2
解释:气球可以用2支箭来爆破:
- 在x=6处射出箭,击破气球[2,8]和[1,6]
- 在x=11处射出箭,击破气球[10,16]和[7,12]
示例2:
输入:
4
1 2
2 3
3 4
4 5
输出:
2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2]和[2,3]
- 在x = 4处射出箭,击破气球[3,4]和[4,5]
提示:
- points.length <= 100
- points[i].length == 2
- -100 <= x_start < x_end <= 100
样例输入输出
样例2
输入:
4
1 2
2 3
3 4
4 5
输出:
2
样例1
输入:
4
10 16
2 8
1 6
7 12
输出:
2
#include<iostream>
using namespace std;
int MinArrow(int n,int** pos) {
for (int i = 0; i < n-1; i++) {
for (int j = i; j < n-1; j++) {
if (pos[j][1] > pos[j + 1][1]) {
int temp0 = pos[j][0];
int temp1 = pos[j][1];
pos[j][0] = pos[j + 1][0];
pos[j][1] = pos[j + 1][1];
pos[j + 1][0] = temp0;
pos[j + 1][1] = temp1;
}
else if ((pos[j][1] == pos[j + 1][1])&&pos[j][0]>pos[j+1][0]) {
int temp0 = pos[j][0];
int temp1 = pos[j][1];
pos[j][0] = pos[j + 1][0];
pos[j][1] = pos[j + 1][1];
pos[j + 1][0] = temp0;
pos[j + 1][1] = temp1;
}
}
}
int arrowCount = 0;
int right = -200;
for (int i = 0; i < n; i++) {
if (right >= pos[i][0]) {
continue;
}
else {
arrowCount++;
right = pos[i][1];
}
}
return arrowCount;
}
int main() {
int n;
cin >> n;
int** pos = new int* [n];
for (int i = 0; i < n; i++) {
pos[i] = new int[2];
cin >> pos[i][0] >> pos[i][1];
}
cout << MinArrow(n, pos) << endl;
}
最小延迟调度
总提交数: 549次通过数: 394次通过率: 71.77%
内存限制: 104857600(BYTE)时间限制: 1000(MS)输入限制: 1000(行)输出限制: 1000(行)
题目描述
给定等待服务的客户集合 A = {1, 2, 3, ..., n},预计对客户 i 的服务时间是 ti,该客户希望的完成时间是 di,即 T = {t1, t2, t3, ..., tn},D = {d1, d2, d3, ..., dn}。如果对客户 i 的服务在 di 之前结束,那么对客户 i 的服务没有延迟;如果在 di 之后结束,那么这个服务就被延迟,延迟时间等于该服务结束的时间减去 di。一个调度是函数 f : A -> N,f(i) 为客户 i 的服务开始时间,一个调度 f 的最大延迟是所有客户延迟时间的最大值,请使用贪心算法求出使最大延迟达到最小的调度,输出该调度的最大延迟时间。
输入的第一行是整数 n,表示一共 n 个客户。
接下来输入的 n 行,每行2个整数,分别表示该客户的服务时间和希望完成时间。
样例输入输出
样例1
输入:
5
5 10
8 12
4 15
10 11
3 20
输出:
12
#include<iostream>
using namespace std;
int MinLate(int n, int** time) {
for (int i = 0; i < n - 1; i++) {
for (int j = i; j < n - 1; j++) {
if (time[j][1] > time[j + 1][1]) {
int temp0 = time[j][0];
int temp1 = time[j][1];
time[j][0] = time[j + 1][0];
time[j][1] = time[j + 1][1];
time[j + 1][0] = temp0;
time[j + 1][1] = temp1;
}
}
}
int maxLate = 0;
int nowtime = 0;
for (int i = 0; i < n; i++) {
nowtime += time[i][0];
maxLate = maxLate < nowtime - time[i][1] ? nowtime - time[i][1] : maxLate;
}
return maxLate;
}
int main() {
int n;
cin >> n;
int** time = new int* [n];
for (int i = 0; i < n; i++) {
time[i] = new int[2];
cin >> time[i][0] >> time[i][1];
}
cout << MinLate(n, time) << endl;
}