网络流24题——圆桌问题 luogu 3254

题目传送门:这里

这是网络流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;
}

  

posted @ 2019-04-24 16:12  lleozhang  Views(139)  Comments(0Edit  收藏  举报
levels of contents