题目传送门:这里
这是网络流24题里最简单的一道,我们从这里开始
虽然是网络流24题之一,但可以不用网络流...
本题采用贪心即可
有一个很显然的思想:在分配每一组时,我们都应当优先分配给当前可容纳人数更多的桌
证明:这样做显然能最大限度的保留可以用的桌,如果这样做都不合法,那么其他策略一定不合法
那么我们用个优先队列维护即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct node
{
int num;
int idd;
friend bool operator < (node x,node y)
{
return x.num<y.num;
}
}p[155],q[275];
priority_queue <node> M;
vector <int> v[155];
bool cmp(node x,node y)
{
return x.num>y.num;
}
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&p[i].num),p[i].idd=i;
for(int i=1;i<=m;i++)scanf("%d",&q[i].num),q[i].idd=i,M.push(q[i]);
sort(p+1,p+n+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=p[i].num;j++)
{
if(M.empty())
{
printf("0\n");
return 0;
}
node u=M.top();
M.pop();
v[p[i].idd].push_back(u.idd);
q[u.idd].num--;
}
for(int j=0;j<v[p[i].idd].size();j++)
{
if(q[v[p[i].idd][j]].num)M.push(q[v[p[i].idd][j]]);
}
}
printf("1\n");
for(int i=1;i<=n;i++)
{
for(int j=0;j<v[i].size();j++)printf("%d ",v[i][j]);
printf("\n");
}
return 0;
}