算法题:分配资源ID

1.描述

给定两个整数,指定管理资源的范围。
可用选择从头分配,也可以指定ID进行分配,释放资源时需要指定ID进行释放,并将资源放入尾部(若超出范围或者指定不合适,则操作失败,什么也不执行)
初始为有序的,要求经过若干次操作后的第一个空闲资源ID。

采用队列进行模拟,并用哈希表表示资源是否可用。这里的主要困难是,如果指定ID进行分配,那么不会立即将其弹出。但如果此时释放该资源的话,会重新将该ID加入队列尾部。这样在队列中就有重复元素出现。

解决方法为:
使用两个哈希表,一个表示该资源是否可用,一个标识该资源在队列中的出现次数。
如果从头进行分配时,必须满足两个条件:资源可用,出现次数为1

可用维护一个可用资源的数量,用来应对从头分配时,空闲ID不足分配失败的场景

2.代码

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
int main(){
  int ln, rn;
  cin >> ln >> rn;
  queue<int> q;
  unordered_map<int,int> mm;       // 代表出现几次
  unordered_map<int,int> mm1;      // 代表是否可用
  int remin_num = rn - ln + 1;
  for(int i = ln; i <= rn; i++) {
    q.push(i);
    mm[i] = 1;
    mm1[i] = 0;
  }
  int t;
  cin >> t;
  int fnum, snum;
  for(int i = 0; i < t; i++) {
    cin >> fnum >> snum;
    if(fnum == 1) {
      if(remin_num < snum)
        continue;
      remin_num -= snum; 
      int tmp = snum;
      while(tmp) {
        int cur = q.front();
        q.pop();
        if( mm1[cur] == 0 && mm[cur] == 1 ) {
          mm1[cur] = 1;
          tmp--;
        }
        mm[cur]--;
      }
    }else if(fnum == 2) {
      if( snum >= ln && snum <= rn && mm1[snum] == 0 ) {
        mm1[snum] = 1;    
        remin_num--;
      }
    }else {
      if( snum >= ln && snum <= rn && mm1[snum] == 1) {
        mm1[snum] = 0; 
        mm[snum]++;
        remin_num++;
        q.push(snum);
      }
    }
  }
  while(!q.empty() && (mm[q.front()] > 1 || mm1[q.front()] == 1)) {
    mm[q.front()]--;
    q.pop();
  }
  cout << q.front() << endl;
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是C语言实现银行家算法资源分配的示例代码: ```c #include <stdio.h> #include <stdbool.h> #define MAX_PROCESS 10 #define MAX_RESOURCE 10 int available[MAX_RESOURCE]; int max[MAX_PROCESS][MAX_RESOURCE]; int allocation[MAX_PROCESS][MAX_RESOURCE]; int need[MAX_PROCESS][MAX_RESOURCE]; bool finish[MAX_PROCESS]; int num_process, num_resource; bool is_safe() { int work[MAX_RESOURCE]; for (int i = 0; i < num_resource; i++) { work[i] = available[i]; } bool finish_copy[MAX_PROCESS]; for (int i = 0; i < num_process; i++) { finish_copy[i] = finish[i]; } bool found; do { found = false; for (int i = 0; i < num_process; i++) { if (!finish_copy[i]) { bool can_finish = true; for (int j = 0; j < num_resource; j++) { if (need[i][j] > work[j]) { can_finish = false; break; } } if (can_finish) { finish_copy[i] = true; found = true; for (int j = 0; j < num_resource; j++) { work[j] += allocation[i][j]; } } } } } while (found); for (int i = 0; i < num_process; i++) { if (!finish_copy[i]) { return false; } } return true; } bool request_resources(int process_id, int request[]) { for (int i = 0; i < num_resource; i++) { if (request[i] > need[process_id][i] || request[i] > available[i]) { return false; } } for (int i = 0; i < num_resource; i++) { available[i] -= request[i]; allocation[process_id][i] += request[i]; need[process_id][i] -= request[i]; } if (is_safe()) { return true; } else { for (int i = 0; i < num_resource; i++) { available[i] += request[i]; allocation[process_id][i] -= request[i]; need[process_id][i] += request[i]; } return false; } } int main() { printf("请输入进程数和资源数:"); scanf("%d%d", &num_process, &num_resource); printf("请输入每种资源的总量:"); for (int i = 0; i < num_resource; i++) { scanf("%d", &available[i]); } printf("请输入每个进程所需的各种资源数量:\n"); for (int i = 0; i < num_process; i++) { printf("请输入进程 %d 的资源需求量:", i); for (int j = 0; j < num_resource; j++) { scanf("%d", &max[i][j]); need[i][j] = max[i][j]; } } printf("请输入每个进程已经分配的各种资源数量:\n"); for (int i = 0; i < num_process; i++) { printf("请输入进程 %d 的资源分配量:", i); for (int j = 0; j < num_resource; j++) { scanf("%d", &allocation[i][j]); need[i][j] -= allocation[i][j]; } } for (int i = 0; i < num_process; i++) { finish[i] = false; } if (is_safe()) { printf("当前状态是安全的。\n"); } else { printf("当前状态是不安全的。\n"); } int process_id; int request[MAX_RESOURCE]; printf("请输入请求资源的进程编号:"); scanf("%d", &process_id); printf("请输入请求的各种资源数量:"); for (int i = 0; i < num_resource; i++) { scanf("%d", &request[i]); } if (request_resources(process_id, request)) { printf("请求成功,当前状态是安全的。\n"); } else { printf("请求失败,当前状态是不安全的。\n"); } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值