PTA 会场安排问题 程序存储问题

题目来源:王晓东《算法设计与分析》

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的
贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个
顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小
会场数。)

输入格式:

第一行有 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值