题目传送门:这里
这是网络流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; }