POJ 2028 When Can We Meet? 枚举

本文介绍了一个用于解决会议日期安排问题的算法。该算法通过枚举所有可能的日期,并记录每位委员会成员的可用日期来确定最适合大多数成员的会议日期。特别地,当存在多个满足条件的日期时,选择最早的那个。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

When Can We Meet?
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 5525 Accepted: 3038

Description

The ICPC committee would like to have its meeting as soon as possible to address every little issue of the next contest. However, members of the committee are so busy maniacally developing (possibly useless) programs that it is very difficult to arrange their schedules for the meeting. So, in order to settle the meeting date, the chairperson requested every member to send back a list of convenient dates by E-mail. Your mission is to help the chairperson, who is now dedicated to other issues of the contest, by writing a program that chooses the best date from the submitted lists. Your program should find the date convenient for the most members. If there is more than one such day, the earliest is the best.

Input

The input has multiple data sets, each starting with a line containing the number of committee members and the quorum of the meeting. 

N Q 
Here, N, meaning the size of the committee, and Q meaning the quorum, are positive integers. N is less than 50, and, of course, Q is less than or equal to N. 

N lines follow, each describing convenient dates for a committee member in the following format. 

M Date1 Date2 ... DateM 
Here, M means the number of convenient dates for the member, which is an integer greater than or equal to zero. The remaining items in the line are his/her dates of convenience, which are positive integers less than 100, that is, 1 means tomorrow, 2 means the day after tomorrow, and so on. They are in ascending order without any repetition and separated by a space character. Lines have neither leading nor trailing spaces. 

A line containing two zeros indicates the end of the input. 

Output

For each data set, print a single line containing the date number convenient for the largest number of committee members. If there is more than one such date, print the earliest. However, if no dates are convenient for more than or equal to the quorum number of members, print 0 instead.

Sample Input

3 2
2 1 4
0
3 3 4 8
3 2
4 1 5 8 9
3 2 5 9
5 2 4 5 7 9
3 3
2 1 4
3 2 5 9
2 2 4
3 3
2 1 2
3 1 2 9
2 2 4
0 0

Sample Output

4
5
0
2

Source


枚举题,数据量很小枚举一下,然后注意他要求出场的人数尽量多,所以我用了结构体拍了一下序
ac代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

int map[105][105];
int n,q,m;
struct node{
	int place;
	int num;
}nn[105];

bool cmp(node x,node y)
{
	if(x.num==y.num)
		return x.place<y.place;
	else
		return x.num>y.num;
}

int jdg()
{
	int i,j,num,cnt,flag;
	
	cnt=0;
	flag=0;
	for(j=0;j<105;j++)
	{
		num=0;
		for(i=0;i<105;i++)
		{
			if(map[i][j])	
				num++;
		}
		if(num>=q)
		{
			flag=1;
			nn[cnt].num=num;
			nn[cnt].place=j;
			cnt++;
		}
	}
	
	sort(nn,nn+cnt,cmp);
	if(flag)
		return nn[0].place;
	else
		return -1;
}

int main()
{
	int i,j,tmp,ans;
	
	while(~scanf("%d%d",&n,&q),n+q)
	{
		memset(map,0,sizeof(map));
		
		for(i=0;i<n;i++)
		{
			scanf("%d",&m);
			for(j=0;j<m;j++)
			{
				scanf("%d",&tmp);
				map[i][tmp]=1;
			}
		}
		ans=jdg();
		if(ans>=0)
			printf("%d\n",ans);
		else
			printf("0\n");
	}
	
	
	return 0;
}


### 关于POJ 1256 的枚举算法解题思路 对于 POJ 1256 问题,其核心在于通过枚举的方式找到满足条件的解。由于该问题并未直接提及具体细节,因此可以借鉴类似的枚举策略来解决问题。 #### 枚举算法的核心思想 枚举是一种简单而有效的方法,适用于状态空间较小或者可以通过优化减少复杂度的情况。它通过对所有可能的状态逐一验证,从而找出符合条件的结果[^3]。 #### 解题思路分析 针对 POJ 1256 的需求,假设问题是关于某种组合或排列的选择,则可采用如下方式实现: 1. **定义状态集合**:明确需要枚举的对象及其范围。 2. **约束条件过滤**:在每次枚举过程中加入必要的判断逻辑,提前排除不可能成立的状态。 3. **结果收集与输出**:当某个状态完全匹配给定条件时,记录并返回结果。 以下是基于上述原则的一个通用框架示例代码(Python 实现),用于展示如何构建一个简单的枚举过程: ```python def solve_poj_1256(input_data): result = [] # 定义枚举边界 limit = max(input_data) if input_data else 0 # 开始逐项尝试 for i in range(1, limit + 1): flag = True # 添加自定义校验逻辑 for value in input_data: if not check_condition(i, value): # 自定义函数check_condition需另行定义 flag = False break if flag: result.append(i) return result # 示例辅助函数 (实际应用中应替换为特定业务逻辑) def check_condition(x, y): return x % y == 0 or y % x == 0 # 测试调用 if __name__ == "__main__": sample_input = [2, 3, 5] output = solve_poj_1256(sample_input) print(output) ``` 此脚本仅作为模板提供灵感,在真实场景下还需依据题目描述调整具体的 `input_data` 结构以及内部判定机制。 #### 进一步优化建议 尽管纯枚举能够覆盖大部分基础情形,但对于规模较大的输入可能会显得效率低下。此时引入剪枝技术便成为提升性能的关键手段之一[^4]。例如可以在循环体内尽早识别那些注定无法达成目标的情形,并立即终止当前分支探索路径。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值