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;
}

### 关于 PTA 平台 01 背包问题 使用分支界限法 解决的程序填空题 #### 示例及解析 在处理0/1背包问题时,分枝限界法通过构建解空间树利用限界函数来剪除不可能获得更优解的部分子树,从而减少不必要的计算。对于给定的一组物品及其价值和重量以及容量有限的背包,目标是在不超过总容量的情况下使所选物品的价值最大化。 下面是一个基于队列式的分枝限界算法框架用于解决0/1背包问题的具体实现: ```cpp #include <iostream> #include <queue> using namespace std; struct Node { int level; // 当前节点所在的层数 double profit; // 到达该节点为止已获取的最大利润 double weight; // 已装载货物的总重 }; // 定义比较器以便按照效益比降序排列待处理节点 bool operator<(const Node& a, const Node& b) { return (a.profit / max(a.weight, 1)) < (b.profit / max(b.weight, 1)); } double knapsack(int n, double capacity, vector<double>& weights, vector<double>& values) { priority_queue<Node> Q; // 初始化根节点将之加入到优先级队列中 Node u{0, 0.0, 0.0}; Q.push(u); while (!Q.empty()) { u = Q.top(); Q.pop(); if (u.level == n || u.weight >= capacity) continue; // 创建左孩子(不取当前层对应商品) Node v_left = u; ++v_left.level; // 如果右孩子的权重不会超过最大载荷,则创建它 if ((u.weight + weights[u.level]) <= capacity){ Node v_right = u; v_right.level++; v_right.profit += values[v_level]; v_right.weight += weights[v_level]; // 将两个新生成的孩子节点按顺序压入堆栈等待进一步探索 Q.push(v_left); Q.push(v_right); // 更新最佳解决方案记录... } } } ``` 上述代码片段展示了如何使用C++语言编写一个简单的基于优先队列的分枝限界方法去尝试找到最优解的过程[^1]。需要注意的是,在实际应用过程中还需要考虑更细节,比如边界条件检查、输入验证等;此外,这仅给出了基本思路,未给出完整的可执行版本。 为了适应PTA平台上可能遇到的实际题目形式,通常会提供部分完成好的代码模板让参赛者补充缺失的关键逻辑或参数设置等内容。因此练习这类题目时建议仔细阅读具体要求说明文档中的指导信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值