[贪心]活动安排问题2

题目大意:有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?

解题关键:策略: 按照开始时间排序优先安排活动,如果冲突,则加一个教室。

1、利用优先队列

 1 #include<bits/stdc++.h>
 2 #define INF 0X3F3F3F3F
 3 using namespace std;
 4 typedef long long ll;
 5 string s;
 6 pair<int,int>pp[10002];
 7 int a[26];
 8 bool flag[10002];
 9 int main(){
10     priority_queue<int,vector<int>,greater<int> >q;
11     int n,count=1;
12     cin>>n;
13     for(int i=1;i<=n;i++){
14         cin>>pp[i].first>>pp[i].second;
15     }
16     sort(pp+1,pp+n+1);
17     q.push(pp[1].second);
18     for(int i=2;i<=n;i++){
19         if(pp[i].first>=q.top()){
20             q.pop();
21             q.push(pp[i].second);
22         }else{
23             count++;
24             q.push(pp[i].second);
25         }
26     }
27     printf("%d\n",count);
28     return 0;
29 }

2、求线段相交的次数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 vector<pair<int,int> >event;
 5 int main(){
 6     int n;
 7     scanf("%d",&n);
 8     int st,ed;
 9     for(int i=0;i<n;i++){
10         scanf("%d%d",&st,&ed);
11         event.push_back(make_pair(st,1));
12         event.push_back(make_pair(ed,-1));
13     }
14     sort(event.begin(),event.end());
15     int cnt=0,ans=0;
16     for(int i=0;i<event.size();i++){
17         cnt+=event[i].second;
18         ans=max(ans,cnt);
19     }
20     printf("%d\n",ans);
21     return 0;
22 }  
时间: 2024-10-12 03:35:29

[贪心]活动安排问题2的相关文章

【算法导论实验5】贪心-活动安排问题与背包问题

首先是活动安排问题. 贪心的关键在于排序策略. 思路很简单,对所有活动的结束时间排序,如果结束时间相同,因为要尽量多的参加活动,所以选取开始时间尽量晚的(这样可以安排的比较多),然后依次从早到晚选取不冲突的活动加入,即为最多可以参加的活动. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <fstream> using n

hdu 2037简单贪心--活动安排问题

活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动能兼容地使用公共资源 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有 一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源

hdu2037-----------贪心, 活动安排问题

http://acm.hdu.edu.cn/showproblem.php?pid=2037(简单贪心-----活动安排) #include<iostream> #include<algorithm> using namespace std; struct Node { int l, r; }a[105]; bool Cmp(Node x, Node y) { if(x.r!=y.r) return x.r<y.r; else return x.l>y.r; } int

贪心算法_活动安排问题_哈弗曼编码

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源.若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的.也就是说,当si >= fj或sj >= fi时,活动i与活动j相容. 由于输入的活动以其完成时间的非减序排列,所以算法

贪心算法-----单线程:活动安排问题 多线程:多机调度问题

一.贪心算法的特点 顾名思义,贪心算法总是做出在当前看来是最好的选择.虽然贪心算法并不从整体最优上加以考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的优点是更简单,更直接且解题效率更高,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解. 二.贪心算法的理解 由于涉及到在做出在当前看来最好的选择,所以会经常采用排序算法,推荐使用快速排序算法,复杂度是O(nlgn),且在同等复杂度算法中效率是最高的, 本文涉及的排序都采用冒泡排序,只是注明需要排序而已. 贪心算法

忙碌的Nova君 (活动安排问题、贪心算法)

题目描述 理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦,balabala......然而精力有限,Nova君同一时间只能做一件事,并不能一心二用.假设现在有N项工作等待Nova君完成,分别在 Si 时刻开始,在 Ti 时刻结束,对于每项工作可以选择做或者不做,但不可以同时选择时间重叠的工作(即使是开始的瞬间和结束的瞬间重叠也是不允许的).Nova君自然希望尽量多做一些事情,那么最多能做几件事呢? 输入 多组测试数据(数据组数不超过10),对于每组

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

活动安排问题(贪心算法)

问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺利进行,即也就是每个活动的活动时间都互相不交叉,求m的最大值和 被选中的活动序号. 例如输入: 活动编号   活动开始时间    活动结束时间 1                1                       4 2                3                 

hdu2037今年暑假不AC(贪心,活动安排问题)

今年暑假不AC Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 15   Accepted Submission(s) : 13 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯