[洛谷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;
}
原文地址:https://www.cnblogs.com/Memory-of-winter/p/9163664.html