Acwing_803(区间合并)

原题链接:

803. 区间合并 - AcWing题库

题解:

简单来讲就是先对区间左端点进行排序,然后开始逐渐处理,会遇到如下3种情况。

参考模板:常用代码模板1——基础算法 - AcWing

代码:

#include<bits/stdc++.h>
using namespace std;
using PII = pair<int, int>;
const int N = 1e5 + 10;
vector<PII> q;
const int M = -2e9;//定义一个取不到的起始区间端点

void merge(vector<PII>& a) {
	vector<PII> b;
	sort(a.begin(), a.end());
	int st = M, ed = M;
	for (auto [l, r] : a) {
		if (ed < l) {//两个区间不相交
			if (st != M) b.push_back({ st,ed });
			st = l, ed = r;
		}
		else//可能是包含或者相交
			ed = max(ed, r);
	}
	if (st != M) b.push_back({ st,ed });
	a = b;
}

int main() {
	int n;cin >> n;
	for (int i = 0;i < n;i++) {
		int l, r;cin >> l >> r;
		q.push_back({ l,r });
	}
	merge(q);
	cout << q.size() << endl;
}
根据引用\[1\]和引用\[2\]的代码,这是一个动态规划问题。问题描述为阿福想要在不惊动警察的情况下,洗劫一条街上的店铺,每家店铺中都有一些现金。阿福只能同时洗劫两家相邻的店铺,否则会触发报警系统。阿福想知道,在这种情况下,他今晚最多可以得到多少现金。 根据引用\[2\]的代码,动态规划的思路是定义一个数组f,其中f\[i\]表示只偷窃前i个店铺的情况下所能得到的最大现金。初始条件为f\[0\]=0和f\[1\]=a\[1\],其中a\[1\]是第一个店铺的现金。然后根据状态转移方程f\[i\] = max{f\[i-1\], a\[i\] + f\[i-2\]},计算出f\[n\],即为阿福今晚最多可以得到的现金。 根据引用\[1\]的代码,可以看到在每次循环中,dp\[i\]\[0\]表示不偷窃第i家店铺的最大现金,dp\[i\]\[1\]表示偷窃第i家店铺的最大现金。根据状态转移方程dp\[i\]\[0\] = max{dp\[i-1\]\[0\], dp\[i-1\]\[1\]}和dp\[i\]\[1\] = dp\[i-1\]\[0\] + a\[i\],计算出dp\[n\]\[0\]和dp\[n\]\[1\],然后取其中较大的值作为阿福今晚最多可以得到的现金。 综上所述,根据引用\[2\]的代码,阿福今晚最多可以得到的现金为f\[n\],根据引用\[1\]的代码,阿福今晚最多可以得到的现金为max(dp\[n\]\[0\], dp\[n\]\[1\])。 #### 引用[.reference_title] - *1* [AcWing 1049. 大盗阿福](https://blog.csdn.net/qq_43254375/article/details/104605407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【ACWing】1049. 大盗阿福](https://blog.csdn.net/qq_46105170/article/details/114259818)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值