进程分配

题目描述
对操作系统来说,进程控制很重要。每个进程运行的需要占用资源,当进程结束的时候,它所占用的资源会全部释放。因此,不同的资源分配策略就显的很重要,一些不好的策略将导致死锁。现在我们有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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值