U E D R , A S I H C RSS

The Grand Dinner/하기웅

소�

- algorithm ��브러리 너무 좋�..ㅋㅋㅋ
- 한가지� 예외를 �� 못해 조금 헤맸�~

��

- 가장 많� 사람� 있는 팀부터 가장 많� �리가 있는 테�블부터 한명씩 배치시키면 �다.
- 그렇게 배치 시키다가 �리가 남지 않아 배치할 수 없는 순간� 오면 그 배치 �만 아니� 다른 어떤 방법으로� 배치가 불가능하다.
- 어� 한팀� ��� 테�블� 수보다 많아버리면 무조건 배치가 불가능해진다.

코딩 방법

- 팀� �름표를 붙�고 그 �태�서 ��� 많� 순으로 정렬
- 테�블� �름표를 붙�고 그 �태�서 �리가 많� 순으로 정렬
- ��� 많� 팀부터 �리가 많� 테�블� 앉히면서 테�블� 앉� 수 있는 �리수를 �소 시키고 팀� 사람�게 테�블 번호를 부여
- �렇게 �면 �리가 많� 테�블� 먼저 앉� 수 있는 �리가 0� � 수는 없게�다.
- 앉히다가 테�블� 앉� 수 있는 �리� 수가 0� 테�블� 만나면 return false.
- 0ì�„ 만나지 않고 다 배치시키고 나면 '1'ì�„ ìœë ¥í•˜ê³  사람ì—�게 메겨진 í…Œì�´ë¸” 번호ì�˜ ìž‘ì�€ 순으로 ì •ë ¬ 후 ìœë ¥
- 0ì�„ 만나게 ë�˜ë©´ '0'ì�„ ìœë ¥

소스

#include <iostream>
#include <algorithm>
using namespace std;

int input1, input2;
int i, j;

struct Team {
	int number;
	int memberNum;
	int person[101];
};

struct Table {
	int number;
	int chairNum;
	int chair[101];
};

Team team[71];
Table nTable[51];

bool compareTeam(const Team &a, const Team &b)
{
	return a.memberNum>b.memberNum;
}

bool compareTeam2(const Team &a, const Team &b)
{
	return a.number<b.number;
}

bool compareTable(const Table &a, const Table &b)
{
	return a.chairNum>b.chairNum;
}

void printTeam()
{
	cout << "1" <<endl;
	for(i=1; i<input1+1; i++)
	{
		for(j=1; j<team[i].memberNum+1; j++)
			cout << team[i].person[j] << " ";
		cout <<endl;
	}
}

bool matchingTable()
{
	for(i=1; i<input1+1; i++)
	{
		for(j=1; j<team[i].memberNum+1; j++)
		{
			if(team[i].memberNum>input2)
				return false;
			if(nTable[j].chairNum>0)
			{
				nTable[j].chairNum--;
				team[i].person[j] = nTable[j].number;
			}
			else
				return false;
		}
		sort(&team[i].person[1], &team[i].person[team[i].memberNum+1]);
	}
	return true;
}

int main()
{
	while(cin >> input1 >> input2)
	{
		if(input1==0 && input2==0)
			break;
		for(i=1; i<input1+1; i++)
		{
			cin >> team[i].memberNum;
			team[i].number=i;
		}
		for(i=1; i<input2+1; i++)
		{
			cin >> nTable[i].chairNum;
			nTable[i].number=i;
		}
		sort(&team[1], &team[input1+1], compareTeam);
		sort(&nTable[1], &nTable[input2+1], compareTable);
		if(matchingTable())
		{
			sort(&team[1], &team[input1+1], compareTeam2);
			printTeam();
		}
		else
			cout << "0" <<endl;
	}
	return 0;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:12
Processing time 0.0043 sec