题目大意:
给你N(N<=50000)个进程,M(M<=3)个资源,然后给你一个M*N的矩阵表示每各个进程的每个资源的初始分配,再给你一个M*N的矩阵表示各个进程的每个资源还需要的资源,问你能不能合理安排顺序,使得N个进程能够依次运行完。每个进程运行完之后,都会释放他所占有的所有资源。
题解:
对每种资源开一个队列,记录各个进程的对此种资源的需要,并从小到达排序。然后每次考虑队首元素,看能不能满足条件。直到找到满足条件的n个进程为止。这样每个进程至多出队M次。
时间复杂度O(N*M*logN+N*M*M)
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct que
{
int id;
long long value;
bool operator<(const que& y)const
{
return value<y.value;
}
};
long long a[51000][4],r[51000][4],s[4];
int head[4];
que q[4][51000];
int n,m;
bool v[51000];
bool can(int x)
{
for(int j=1;j<=m;j++)
if(s[j]<r[x][j])return false;
return true;
}
bool all_end()
{
for(int i=1;i<=m;i++)
if(head[i]<=n)return false;
return true;
}
int main()
{
while(cin>>n>>m)
{
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)
cin>>a[i][j];
for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++)
cin>>r[i][j];
for(int i=1;i<=m;i++)
cin>>s[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
q[j][i].id=i;
q[j][i].value=r[i][j];
}
for(int j=1;j<=m;j++)
sort(q[j]+1,q[j]+1+n);
memset(v,false,sizeof(v));
for(int j=1;j<=m;j++)
head[j]=1;
int num=0;
while(num<=n)
{
if(all_end())break;
for(int i=1;i<=m;i++)
while(head[i]<=n && v[q[i][head[i]].id])head[i]++;
for(int i=1;i<=m;i++)
{
if(head[i]<=n && can(q[i][head[i]].id))
{
v[q[i][head[i]].id]=true;
for(int j=1;j<=m;j++)
s[j]+=a[q[i][head[i]].id][j];
num++;
head[i]++;
break;
}
else
head[i]++;
}
}
if(num==n)cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
return 0;
}