http://acm.hdu.edu.cn/showproblem.php?pid=6396
题意:
操作系统的资源调度问题,银行家算法。
问你最后可能得到的最大资源和调度次数。
思路:
因为给的资源最大为5,所以不妨给5个资源都排序。并记住每个资源所属一开始的那个进程号。
排序前最好横向存储数据,不然对二维数组的第一维排序的话操作起来很别扭。
排完序以后,后面的过程文字叙述比较麻烦,插入图片解释。
对k个从小到大开始扫描,把比已有资源小的现需资源都记录保存,直到找到第一个满足k个资源都得到满足的情况。比如下图:
比如说扫描到了当前位置,找到了一个5个资源都被满足的情况,但是在扫描线上面的都要被记录下来,以便后面扫描使用。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <memory.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
int allo[5][100005], reqs[5][100005], avai[5], indx[5];
pair<int, int> queu[5][100005];
bool flag[5][100005];
int n, m;
namespace Input
{
const int BUF = 65536;
char buf[BUF + 1];
char *head = buf, *tail = buf;
}
inline char inputchar()
{
using namespace Input;
if (head == tail)
*(tail = (head = buf) + fread(buf, 1, BUF, stdin)) = 0;
return *head++;
}
inline void input(int &ret)
{
char ch = inputchar();
while (ch < '0' || ch > '9')
ch = inputchar();
ret = ch - '0';
ch = inputchar();
while (ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
ch = inputchar();
}
}
inline void input(long long &ret)
{
char ch = inputchar();
while (ch < '0' || ch > '9')
ch = inputchar();
ret = ch - '0';
ch = inputchar();
while (ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
ch = inputchar();
}
}
int main() {
//freopen("A.in", "r", stdin);
int i, j, k, cunt;
bool sign;
int T;
//cin >> T;
input(T);
while(T--){
//cin >> n >> m;
input(n);
input(m);
for (i = 0; i < m; i++)
input(avai[i]);
//scanf("%d", &avai[i]);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
input(reqs[j][i]);
//scanf("%d", &reqs[j][i]);
queu[j][i].first = reqs[j][i];
queu[j][i].second = i;
}
for (j = 0; j < m; j++) {
input(allo[j][i]);
//scanf("%d", &allo[j][i]);
}
}
for (i = 0; i < m; i++)
sort(queu[i], queu[i] + n);
sign = true;
cunt = 0;
memset(indx, 0, sizeof(indx));
memset(flag, 0, sizeof(flag));
while (sign) {
sign = false;
for (i = 0; i < m; i++) {
for (j = indx[i]; j < n; j++) {
if (queu[i][j].first > avai[i])
break;
flag[i][queu[i][j].second] = true;
for (k = 0; k < m; k++) {
if (!flag[k][queu[i][j].second])
break;
}
if (k == m) {
sign = true;
cunt++;
for (k = 0; k < m; k++) {
avai[k] += allo[k][queu[i][j].second];
if (avai[k] > 1000000000)
avai[k] = 1000000000;
}
}
}
indx[i] = j;
}
}
cout << cunt << endl;
for (int i(0); i < m; i++) {
cout << avai[i];
if (i != m - 1)cout << " ";
}
cout << endl;
}
return 0;
}