欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 贪心算法-区间问题 C++

贪心算法-区间问题 C++

2024/11/29 22:42:15 来源:https://blog.csdn.net/m0_62112384/article/details/144009317  浏览:    关键词:贪心算法-区间问题 C++

题目一

在这里插入图片描述

解题思路

原题解:https://www.acwing.com/solution/content/79913/在这里插入图片描述

代码实现

#include<iostream>
#include<algorithm>using namespace std;const int N = 1e5 + 10;struct Range {int l, r;bool operator < (const Range &w) const {return r < w.r;}
}range[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++ ){scanf("%d%d", &range[i].l, &range[i].r);}sort(range, range + n);int res = 0, ed = -0x3f3f3f3f;for (int i = 0; i < n; i ++ ){if (ed < range[i].l){res ++;ed = range[i].r;}}cout << res;return 0;
}

题目二

在这里插入图片描述

解题思路

在这里插入图片描述

代码实现

#include<iostream>
#include<algorithm>using namespace std;const int N = 1e5 + 10;struct Range {int l, r;bool operator < (const Range &w) const {return r < w.r;}
}range[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++ ){scanf("%d%d", &range[i].l, &range[i].r);}sort(range, range + n);int res = 0, ed = -0x3f3f3f3f;for (int i = 0; i < n; i ++ ){if (ed < range[i].l){ed = range[i].r;res ++;}}cout << res;return 0;
}

题目三

在这里插入图片描述

解题思路

原题解:https://www.acwing.com/solution/content/14773/
在这里插入图片描述

代码实现

#include<iostream>
#include<algorithm>
#include<queue>using namespace std;const int N = 1e5 + 10;struct Range {int l, r;bool operator < (const Range &w) const{return l < w.l;}
}range[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++ ){scanf("%d%d", &range[i].l, &range[i].r);}sort(range, range + n);priority_queue<int ,vector<int>, greater<int>> heap;for (int i = 0; i < n; i ++){if (heap.empty() || range[i].l <= heap.top()){heap.push(range[i].r);}else{heap.pop();heap.push(range[i].r);}}cout << heap.size();return 0;
}

题目四

在这里插入图片描述

解题思路

原题解:https://www.acwing.com/solution/content/16980/
在这里插入图片描述
为什么r = -2e9不能放在for循环内:
例如样例:
4 10 2
4 5
11 12
当第一轮st更新后是5,第二轮j 还是 0,不过此时应该退出了,但如果-2e9放在外面,
if (r < st)
{
res = -1;
break;
}
就不会执行

代码实现

#include<iostream>
#include<algorithm>using namespace std;const int N = 1e5 + 10;struct Range {int l, r;bool operator < (const Range &w) const {return l < w.l;}
}range[N];int main()
{int st, ed, n;cin >> st >> ed >> n;for (int i = 0; i < n; i ++ ){scanf("%d%d", &range[i].l, &range[i].r);}sort(range, range + n);int res = 0;bool flag = false;for (int i = 0; i < n; i ++){int j = i, r = -0x3f3f3f3f;while (range[j].l <= st && j < n){r = max(r, range[j].r);j ++;}if (r < st){flag = true;break;}res ++;st = r;if (r >= ed){break;}i = j - 1;}if (flag || st < ed){res = -1;}cout << res;return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com