• 网络流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
    ");
    				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
    ");
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<v[i].size();j++)printf("%d ",v[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    解决:Android 8.0检测不到当前的activity
    flask学习(十三):过滤器
    打开相册上传图片
    完整的项目
    解决ScrollView滑动RecyclerView的卡顿
    RxJava
    CoordinatorLayout
    NestedScrollView,RecyclerView
    ViewPageIndicator
    RxJava的实现原理
  • 原文地址:https://www.cnblogs.com/zhangleo/p/10762989.html
Copyright © 2020-2023  润新知