题目大意:
给你两个数字n和m,n代表进程的个数,m代表资源的个数。
现在题目要求你输入4个部分:
1.n和m
2.当前每个进程所含有的资源数,注意这里行为资源,列为进程
3.每个进程每次执行所需要的资源数
4.当前操作系统所拥有的资源
现在要你模拟银行家算法,分析是否能把所有的进程跑完,如果能就Yes,否则No
解析:
银行家算法的步骤:
每次查找所需要没有用过的进程,并把当前进程所需要的资源和操作系统的资源比较,如果操作系统的资源 < 所需要的资源,就不使用,否则使用当前的进程,并把当前进程标记为访问,并把所有的资源返回给操作系统。
暴力模拟银行家算法,但是请注意有一个坑点,就是要进程从后往前算,否则超时。
给你两个数字n和m,n代表进程的个数,m代表资源的个数。
现在题目要求你输入4个部分:
1.n和m
2.当前每个进程所含有的资源数,注意这里行为资源,列为进程
3.每个进程每次执行所需要的资源数
4.当前操作系统所拥有的资源
现在要你模拟银行家算法,分析是否能把所有的进程跑完,如果能就Yes,否则No
解析:
银行家算法的步骤:
每次查找所需要没有用过的进程,并把当前进程所需要的资源和操作系统的资源比较,如果操作系统的资源 < 所需要的资源,就不使用,否则使用当前的进程,并把当前进程标记为访问,并把所有的资源返回给操作系统。
暴力模拟银行家算法,但是请注意有一个坑点,就是要进程从后往前算,否则超时。
可能是出题者为了坑人,故意把所有的可能情况都出到了后面。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 50005;
const int M = 5;
//N代表进程数,M代表资源
int all[N][M] ,req[N][M] ,res[M];
int vis[N];
int n,m;
bool judge(int i) {
for(int j = 0; j < m; j++) {
if(req[i][j] > res[j]) {
return false;
}
}
return true;
}
int main() {
while(scanf("%d%d",&n,&m) != EOF) {
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
scanf("%d",&all[j][i]);
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
scanf("%d",&req[j][i]);
}
}
for(int i = 0; i < m; i++) {
scanf("%d",&res[i]);
}
int sum = 0 ,cnt;
memset(vis,0,sizeof(vis));
while(true) {
cnt = 0;
for(int i = n-1; i >= 0; i--) {
if(!vis[i] && judge(i)) {
vis[i] = true;
for(int j = 0; j < m; j++) {
res[j] += all[i][j];
}
cnt++;
}
}
sum += cnt;
if(sum == n || cnt == 0) {
break;
}
}
if(sum == n) {
printf("Yes\n");
}else {
printf("No\n");
}
}
return 0;
}