UVA - 10249 The Grand Dinner

来源:互联网 发布:mysql时间转换成毫秒值 编辑:程序博客网 时间:2024/06/10 12:26

Description

Download as PDF

Problem D

The Grand Dinner

Input: standard input

Output: standard output

Time Limit: 15 seconds

Memory Limit: 32 MB

 

Each team participating in this year’s ACM World Finals contest is expected to join the grand dinner to be arranged after the prize giving ceremony ends. In order to maximize the interaction among the members of different teams, it is expected that no two members of the same team sit at the same table.

 

Now, given the number of members in each team (including contestants, coaches, reserves, guests etc.) and the seating capacity of each available table, you are to determine whether it is possible for the teams to sit as described in the previous paragraph. If such an arrangement is possible you must also output one possible seating arrangement. If there are multiple possible arrangements, any one is acceptable.

 

Input

 The input file may contain multiple test cases. The first line of each test case contains two integersM (1 £M£ 70) and N (1 £N£ 50) denoting the number of teams and the number of tables respectively. The second line of the test case containsM integers where the i-th (1 £i£M) integermi (1 £mi£ 100) indicates the number of members of teami. The third line contains N integers where thej-th (1 £j£N) integer nj (2 £nj£ 100) indicates the seating capacity of tablej.

 

A test case containing two zeros for M and N terminates the input.

 

Output

For each test case in the input print a line containing either 1 or0 depending on whether or not there exists a valid seating arrangement of the team members. In case of a successful arrangement printM additional lines where the i-th (1 £i£ M) of these lines contains a table number (an integer from1 to N) for each of the members of team i.

 

Sample Input

4 5

4 5 3 5

3 5 2 6 4

4 5

4 5 3 5

3 5 2 6 3

0 0

 

 

Sample Output

1

1 2 4 5

1 2 3 4 5

2 4 5

1 2 3 4 5

0

题意:有m个队伍,n个桌子,要求每个队伍里的人不能出现在同一个桌子上,问是否有这种可能

思路:贪心的每次将桌子能坐的人排序,从大的往小的坐

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 110;struct Node {int id, num;bool operator <(const Node &a) const {return num > a.num;}} a[maxn], b[maxn];struct team {int index[maxn];} res[maxn];int n, m;int tmp[maxn];int main() {while (scanf("%d%d", &m, &n) != EOF && n+m) {int flag = 1;for (int i = 1; i <= m; i++) {scanf("%d", &a[i].num);tmp[i] = a[i].num;a[i].id = i;if (a[i].num > n)flag = 0;}for (int i = 1; i <= n; i++) {scanf("%d", &b[i].num);b[i].id = i;}for (int i = 1; i <= m && flag; i++) {sort(b+1, b+1+n);for (int j = 1; j <= a[i].num; j++) {if (b[j].num > 0) {res[a[i].id].index[j] = b[j].id;b[j].num--;}else {flag = 0;break;}}}if (!flag) {printf("0\n");continue;}printf("1\n");for (int i = 1; i <= m; i++) {sort(res[i].index+1, res[i].index+1+tmp[i]);for (int j = 1; j <= tmp[i]; j++) {if (j == 1)printf("%d", res[i].index[j]);else printf(" %d", res[i].index[j]);}printf("\n");}}return 0;}



0 0