1. 题目
2. 题解
一开始打了个网络流判断是否有解,然后打个贪心算方案。。。
我是不是傻逼啊,直接贪心算答案,发现算不出不就没解么。
只要一个一个地把人放到桌子上,每次取出空位子最多的桌子就行了。
主要是题目没给出总人数,所以可能会 GG。
但是实际是过了的,速度还可以。
代码:
#include <bits/stdc++.h>
#define MKP make_pair
using namespace std;
typedef pair<int,int> PII;
template<typename _Tp>inline void IN(_Tp&dig)
{
char c;dig=0;
while(c=getchar(),!isdigit(c));
while(isdigit(c))dig=dig*10+c-'0',c=getchar();
}
int m,n,r[155],ans[155][275],acnt[155];
priority_queue<PII> pq;
stack<PII> st;
int main()
{
IN(m),IN(n);
for(int i=1;i<=m;i++)IN(r[i]);
for(int i=1,a;i<=n;i++)IN(a),pq.push(MKP(a,i));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=r[i];j++)
{
if(!pq.top().first)puts("0"),exit(0);
ans[i][acnt[i]++]=pq.top().second;
st.push(MKP(pq.top().first-1,pq.top().second));
pq.pop();
}
while(!st.empty())pq.push(st.top()),st.pop();
}
puts("1");
for(int i=1;i<=m;i++,putchar('\n'))
for(int j=0;j<acnt[i];j++)
printf("%d ",ans[i][j]);
return 0;
}
0 条评论