1 条题解

  • 0
    @ 2025-5-12 20:02:59

    题目描述

    ICPC组委会希望尽快召开会议,讨论下届比赛的各种细节。然而,委员会成员们都忙于疯狂开发(可能无用的)程序,很难协调出共同的空闲时间。因此,主席要求每位成员通过邮件提交自己方便的开会日期列表。你的任务是编写一个程序,帮助主席从这些列表中选出最佳的开会日期。

    选择规则

    1. 选择最多成员都方便的日期。
    2. 如果有多个这样的日期,选择最早的一个。
    3. 如果没有日期能满足**法定人数(quorum)**要求,则输出00

    输入格式

    每个测试用例以两个整数NNQQ开头:
    NN表示委员会成员人数(1N<501 \leq N < 50)。
    QQ表示会议法定人数(1QN1 \leq Q \leq N)。
    接下来的NN行,每行描述一个成员的方便日期:第一个整数MM表示该成员的方便日期数量(M0M \geq 0)。随后是MM严格递增的正整数(1Date<1001 \leq \text{Date} < 100),表示具体的方便日期(11=明天,22=后天,依此类推).输入以0 00\ 0结束。

    输出格式

    对于每个测试用例,输出一行:

    • 满足最多成员方便的最早日期。
    • 如果没有日期满足至少QQ人方便,则输出00

    示例

    输入:

    3 2  
    3 1 5 7  
    2 3 5  
    2 5 6  
    2 2  
    1 3  
    1 4  
    0 0
    

    输出:

    5  
    0
    

    解题思路

    1. 统计日期频率:用哈希表统计每个日期被多少成员选中。
    2. 筛选有效日期
      • 仅保留频率Q\geq Q的日期。
      • 若没有这样的日期,直接返回00
    3. 选择最佳日期
      • 在所有有效日期中,选择频率最高的。
      • 若频率相同,选择数值最小的(即最早的)。

    C++代码实现

    #include<stdio.h>
    #include<string.h>
     
    int a[105];
     
    int main()
    {
    	int n,q;
    	while(~scanf("%d%d",&n,&q) && n && q) 
    	{
    		int m,temp,max,count,d;
    		max=temp=count=0;
    		memset(a,0,sizeof(a));
    		
    		while(n--){
    			scanf("%d",&m);
    			for(int i=0;i<m;i++){
    				scanf("%d",&d);
    				a[d]++;
    				if(temp<d)
    					temp=d;
    			}
    		}
    		
    		for(int i=0;i<=temp;i++){
    			if(max<a[i])
    			{
    				max=a[i];
    				count = i;
    			}
    		}
    		if(max<q)
    			printf("0\n");
    		else 
    			printf("%d\n",count);
    	} 
    }
    

    代码说明

    1. 输入处理:使用map统计每个日期的出现次数。
    2. 筛选逻辑
      • 遍历map,记录满足QQ人以上的最高频日期。
      • 频率相同时,选择更小的日期。
    3. 输出结果:若存在有效日期则输出,否则输出00

    复杂度分析

    • 时间复杂度:O(N×M+DlogD)O(N \times M + D \log D),其中DD是不同日期的数量。
    • 空间复杂度:O(D)O(D),用于存储日期频率。
    • 1

    信息

    ID
    1029
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者