NKUSOFT 算法导论上机作业5

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值