1332:【例2-1】周末舞会

本文描述了一个基于循环队列的舞伴配对模拟程序。在一场舞会上,男士和女士分别排队,每轮舞曲开始时,从两队头部各选出一人配对。通过使用两个循环队列来模拟这一过程,程序能够有效地展示配对情况。

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

【题目描述】

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。

【输入】

第一行两队的人数;

第二行舞曲的数目。

 

【输出】

配对情况。

【输入样例】

4 6
7

【输出样例】

1 1
2 2
3 3
4 4
1 5
2 6
3 1

 

这个应该是循环队列吧

这个题的关键是边加边删除

#include<bits/stdc++.h>
#include<queue>
using namespace std;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int k;
    scanf("%d",&k);
    queue<int>Q1;
    queue<int>Q2;
    for(int i=1;i<=n;i++) Q1.push(i);
    for(int i=1;i<=m;i++) Q2.push(i);
    for(int i=0;i<k;i++){
        printf("%d %d\n",Q1.front(),Q2.front());
        Q1.push(Q1.front());
        Q2.push(Q2.front());
        Q1.pop();
        Q2.pop();
    }

    return 0;
}

 

用数组模拟了一下队列

 

#include<bits/stdc++.h>
#include<queue>
using namespace std;
int a[100],b[100];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int k;
    scanf("%d",&k);
    for(int i=1;i<=n;i++) a[i]=i;
    for(int i=1;i<=m;i++) b[i]=i;
    int r1=1,f1=n,r2=1,f2=m;
    for(int i=0;i<k;i++){
        cout<<a[r1]<<" "<<b[r2]<<endl;
        a[++f1]=a[r1];
        r1++;
        b[++f2]=b[r2];
        r2++;
    }

    return 0;
}

 

### 关于 PTA 7-1 周末舞会配对算法的实现 #### 背景描述 PTA 的题目通常涉及模拟场景下的逻辑处理。对于 **周末舞会** 这一问题,其核心在于如何通过有效的数据结构和算法来完成男女之间的最优匹配过程[^1]。 #### 数据输入与输出分析 该类问题一般提供如下形式的数据: - 输入:若干组测试案,每组包含男性人数 $ n $ 和女性人数 $ m $ ,以及各自的跳舞意愿列表。 - 输出:最终能够成功配对的最大数量及其具体组合方式。 为了高效解决此题,可以采用图论中的二分图最大匹配模型来进行求解[^2]。 #### 解决思路概述 利用匈牙利算法 (Hungarian Algorithm),这是一种专门用于计算无权二分图中最大基数匹配的经典技术。它的时间复杂度为 O(VE),其中 V 表示顶点数而 E 则代表边的数量,在本里即对应参与者数目乘以其可能偏好范围之积[^3]。 以下是基于 Python 的一种可行解决方案: ```python from collections import defaultdict, deque def max_bipartite_matching(men_preferences, women_count): """ 使用匈牙利算法找到二分图的最大匹配. 参数: men_preferences (list of list): 每位男士感兴趣的女士编号数组. women_count (int): 所有可选女士总数. 返回值: int: 成功建立的关系对数. """ # 初始化变量 match_to_women = [-1] * women_count def dfs(man_index, visited): for woman in men_preferences[man_index]: if not visited[woman]: visited[woman] = True if match_to_women[woman - 1] == -1 or \ dfs(match_to_women[woman - 1], visited): match_to_women[woman - 1] = man_index return True return False result = 0 for i in range(len(men_preferences)): visited = [False]*women_count if dfs(i, visited): result += 1 return result if __name__ == "__main__": test_cases = int(input().strip()) results = [] while test_cases > 0: _, w = map(int, input().split()) # 获取当前实里的男女人数 preferences = [[]] for _ in range(_): line = list(map(int, input().split())) preferences.append(line[1:]) res = max_bipartite_matching(preferences, w) results.append(res) test_cases -= 1 print("\n".join(map(str,results))) ``` 上述代码片段实现了基本框架并调用了 `max_bipartite_matching` 函数执行实际运算操作[^4]。 #### 结果验证说明 当运行以上脚本时,需注意输入格式应严格遵循样标准;同时考虑到边界情况如完全无法形成任何一对关系或者所有人皆能互相接受的情形下程序表现是否正常亦很重要[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值