您的位置:首页 > 编程语言 > C语言/C++

进程分配

2016-07-17 22:24 204 查看
题目描述

对操作系统来说,进程控制很重要。每个进程运行的需要占用资源,当进程结束的时候,它所占用的资源会全部释放。因此,不同的资源分配策略就显的很重要,一些不好的策略将导致死锁。现在我们有n个进程和m种资源。起初,每个进程已经被分配了一些资源,然后这些资源可能没有达到进程运行的需求,某些类型的资源还需要额外的资源补充。现在还有部分资源你可以分配,你能告诉我,是否能设计最优策略,使得所有进程都能运行。

输入

首先输入T, 表示有组数据

对于每组数据,输入n, m。

然后输入m*n的矩阵,表示对于每个进程,针对每种资源已有多少资源量。

然后输入m*n的矩阵,表示对于每个进程,针对每种资源还缺多少资源量。

最后输入m个数,表示对于每种资源,还有多少资源可分配。

输出

对于每组数据,如果可行,输出’Yes’, 否则’No’。

样例输入

2

4 3

1 6 2 0

0 1 1 0

0 2 1 2

2 0 1 4

2 0 0 2

2 1 3 0

0 1 1

4 3

2 5 2 0

0 1 1 0

1 1 1 2

1 1 1 4

2 0 0 2

1 2 3 0

0 1 1

样例输出

Yes

No

提示

对于30%的数据: 1<=n<=500, 1<=m<=2

对于100%的数据: 1<=n<=50000, 1<=m<=3, 1<=T<=20, 矩阵里的元素范围在1000000以内

与各自的编号排序后

进行线扫

三个指针

十分精妙

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
struct node{
int y,id;
}a[4][50005];
int T;
int n,m,d[4][50005],b[50005],c[4];
bool cmp(node xx,node yy){
return xx.y<yy.y;
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (int j=1;j<=n;j++)
b[j]=0;
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
scanf("%d",&d[i][j]);
for (int i=1;i<=m;i++){
for (int j=1;j<=n;j++){
scanf("%d",&a[i][j].y);
a[i][j].id=j;
}
}
for (int i=1;i<=m;i++)
scanf("%d",&c[i]);
for (int i=1;i<=m;i++)
sort(a[i]+1,a[i]+n+1,cmp);
int zrz=0,bo=1;
int p[4];
for (int i=1;i<=m;i++)
p[i]=1;
while (bo)
{
bo=0;
for (int i=1;i<=m;i++)
{
while (p[i]<=n && c[i]>=a[i][p[i]].y)
{
bo=1;
int ori=a[i][p[i]].id;
b[ori]++;
if (b[ori]==m)
{
for (int ii=1;ii<=m;ii++)
c[ii]+=d[ii][ori];
zrz++;
}
p[i]++;
}
}
}
if (zrz==n) printf("Yes\n");
else printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 排序