HDU - 2474 Process scheduling (模拟银行家算法)

来源:互联网 发布:阿里云 ssh 断开 编辑:程序博客网 时间:2024/04/28 08:50
题目大意:
给你两个数字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;}


0 0
原创粉丝点击