题目来源:王晓东《算法设计与分析》
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的
贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个
顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小
会场数。)
输入格式:
第一行有 1 个正整数k,表示有 k个待安排的活动。
接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间
以 0 点开始的分钟计。
输出格式:
输出最少会场数。
输入样例:
5
1 23
12 28
25 35
27 80
36 50
输出样例:
在这里给出相应的输出。例如:
3
#include <iostream>
#include <queue>
using namespace std;
typedef struct event{
int tistart;
int tiend;
// event(int tis, int tie){
// tistart = tis;
// tiend = tie;
// }
bool operator<(const event& a) const{
return tistart > a.tistart;
}
}event;
int places[1001];
int num = 0;
int main(){
int k;
cin >> k;
priority_queue<event> events;
for(int i=0; i<k; i++){
places[i] = 0;
event e;
cin >> e.tistart >> e.tiend;
events.push(e);
}
int maxi = 0;
while(!events.empty()){
int ok=0;
for(int i=0; i<k; i++){
if(places[i]!=0){
if(events.top().tistart >= places[i])
places[i] = 0;
}
if(places[i]==0 && ok == 0){
ok = 1;
if(maxi<i) maxi = i;
places[i]=events.top().tiend;
}
}
events.pop();
}
cout << maxi+1 <<endl;
}
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50
2 3 13 8 80 20
输出样例:
在这里给出相应的输出。例如:
5
#include <iostream>
#include <queue>
using namespace std;
typedef struct prog{
int lenth;
// event(int tis, int tie){
// tistart = tis;
// tiend = tie;
// }
bool operator<(const prog& a) const{
return lenth > a.lenth;
}
}prog;
int main(){
priority_queue<prog> progs;
int n, L;
cin >> n>> L;
for(int i=0; i<n; i++){
prog p;
cin >> p.lenth;
progs.push(p);
}
int sum = 0, num = 0;
if(progs.top().lenth>L){
cout << 0;
return 0;
}
for(int i=0; i<n; i++){
sum += progs.top().lenth;
if(sum > L){
num = i;
}
progs.pop();
}
if(num == 0) cout << n;
else cout << num;
}