[洛谷P3254]圆桌问题
题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表。要求同一个单位的代表不在同一个餐桌就餐。若可以,输出$1$以及其中一种方案,否则输出$0$
题解:贪心,把餐桌大小和单位人数从小到大排序,因为单位规模越大就越难满足,所以我们优先考虑他们。而桌子越多越好,小桌子又容易满而不能用,所以先坐大桌子。
卡点:无
C++ Code:
#include<cstdio> #include<algorithm> using namespace std; int n,m; struct node{ int num,w; }b[300],a[300]; int s[200][300]; inline bool cmp(node a,node b){return a.w>b.w;} int main(){ scanf("%d%d",&m,&n); for (int i=1;i<=m;i++)scanf("%d",&a[i].w),a[i].num=i;; sort(a+1,a+1+m,cmp); for (int i=1;i<=n;i++)scanf("%d",&b[i].w),b[i].num=i; sort(b+1,b+1+n,cmp); for (int i=1;i<=m;i++){ int j=1; while (a[i].w){ if (j>n){ puts("0"); return 0; } if (b[j].w){ s[a[i].num][++s[a[i].num][0]]=b[j].num; b[j].w--,a[i].w--; } j++; } } puts("1"); for (int i=1;i<=m;i++){ for (int j=1;j<=s[i][0];j++)printf("%d ",s[i][j]); puts(""); } return 0; }