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

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

信息学奥赛一本通(C++版)在线评测系统


【例1】假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。

跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。

规定每个舞曲能有一对跳舞者。若两队初始人数不相同,

则较长的那一队中未配对者等待下一轮舞曲。

现要求写一个程序,模拟上述舞伴配对问题。

输入:第一行两队的人数

     第二行舞曲的数目

【分析】:设计两个队列分别存放男士和女士。

每对跳舞的人一旦跳完后就回到队尾等待下次被选。

如 m=4  n=3  k=6

参考:

一本通 第三部分 数据结构 第二章 队列 1332 :【例2-1】周末舞会 - 内存网

一本通——1332:【例2-1】周末舞会 题解 - 陈晋衍 的博客 - 洛谷博客

1332:【例2-1】周末舞会_weixin_30550271的博客-CSDN博客

https://www.cnblogs.com/lbssxz/p/10740515.html

1332:【例2-1】周末舞会_PX-C的博客-CSDN博客

周末舞会(信息学奥赛一本通-T1332)_Alex_McAvoy的博客-CSDN博客




C++参考代码一:

#include<cstdio>
#include<iostream>
using namespace std;
int  a[10001],b[10001],k1=1,k,i,f1=1,r1,f2=1,r2;
/*
【输入样例】
4 6
7
【输出样例】
1 1
2 2
3 3
4 4
1 5
2 6
3 1
*/ 
int main( void )
{
	int m,n;
	
	//输入
	//第一行两队的人数;
    //第二行舞曲的数目。
	cin>>m>>n;
	cin>>k;
	
	for (i=1;i<=m;i++) a[i]=i;
	for (i=1;i<=n;i++) b[i]=i;
	
	r1=m; 
	r2=n;
	while (k1<=k)
	{ 
		printf("%d %d\n",a[f1],b[f2]);
		
		//第一次a[m+1]=a[1]=1,第二次a[m+2]=a[2]=2,如此循环
		//将a[f1]出队,并且入队 
		r1++; 
		a[r1]=a[f1]; 
		f1++;//出队  
		
		//第一次b[n+1]=b[1]=1,第二次b[n+2]=b[2]=2,如此循环。
		//b[f2]入队 
		r2++; 
		b[r2]=b[f2]; 
		f2++;//出队    
		
		//记录舞曲数 
		k1++;
	}
	
	return 0;
}
/*
【输入样例】
4 6
7

【输出样例】
1 1
2 2
3 3
4 4
1 5
2 6
3 1

作业:将此例题用STL的队列重写 
*/ 

C++参考代码二:

#include<iostream>
using namespace std;
int main( void )
{
    long long n,m,k;
    
    //输入
	//第一行两队的人数;
    //第二行舞曲的数目。
    cin>>n>>m>>k;
    
    //枚举每一対
	for(int i=0;i<k;i++)
    {
        //输出
		cout<<i%n+1<<" "<<i%m+1<<endl;
    }
    
    //完美结束
    return 0;
}
/*
【输入样例】
4 6
7

【输出样例】
1 1
2 2
3 3
4 4
1 5
2 6
3 1
*/

C++参考代码三:

#include<iostream>
using namespace std;
int main( void )
{
    int a,b,c,n=1,m=1;
    cin>>a>>b>>c;
    
	for(int i=1;i<=c;i++)
    {
        if(n==a+1)
            n=1;
        
		if(m==b+1)
            m=1;
        
		cout<<n++<<' '<<m++<<endl;
    }
    
	return 0;
}








信息学奥赛寒假、暑假、国庆十一假期 如何进行集训

信息学奥赛寒假、暑假、国庆十一假期 如何进行集训_dllglvzhenfeng的博客-CSDN博客

信奥书籍推荐之数学篇(2023.02.09)

信奥书籍推荐之数学篇(2023.02.09)_dllglvzhenfeng的博客-CSDN博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
算法思路: 1. 初始化男女队列,用栈来存储未配对的人; 2. 从男队和女队的队头各出一个人,配对成功则输出配对信息,否则将未配对的人压入栈中,等待下一轮配对; 3. 如果有一方的队列为空,则输出剩下的一方的队列信息,并结束程序; 4. 如果两个队列的长度相等,则说明所有人都已经配对成功,输出配对信息,并结束程序; 5. 如果有一个队列的长度大于另一个队列,则说明还有人未配对成功,记录当前舞曲数,继续进行下一轮配对。 代码实现: ```python class Stack: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) def dance(m, n, x, y): # 初始化男女队列 male_queue = list(range(1, m+1)) female_queue = list(range(1, n+1)) # 初始化未配对的男女栈 male_stack = Stack() female_stack = Stack() # 记录舞曲数 dance_count = 0 while True: # 从男女队列的队头各出一个人 male = male_queue.pop(0) female = female_queue.pop(0) # 如果两个人配对成功,则输出配对信息 if male == x and female == y: print("第{}首曲子,{}号男生和{}号女生配对成功!".format(dance_count+1, x, y)) break # 如果有一方的队列为空,则输出剩下的一方的队列信息,并结束程序 if not male_queue: print("第{}首曲子,剩下的女生:{}".format(dance_count+1, female_queue)) break elif not female_queue: print("第{}首曲子,剩下的男生:{}".format(dance_count+1, male_queue)) break # 如果两个队列的长度相等,则说明所有人都已经配对成功,输出配对信息,并结束程序 if len(male_queue) == len(female_queue): print("第{}首曲子,所有人都已经配对成功!".format(dance_count+1)) break # 如果有一个队列的长度大于另一个队列,则说明还有人未配对成功,记录当前舞曲数,继续进行下一轮配对 dance_count += 1 if len(male_queue) > len(female_queue): male_stack.push(male) female_queue.append(female) else: female_stack.push(female) male_queue.append(male) # 处理未配对的男女栈 while not male_stack.is_empty() and not female_stack.is_empty(): male = male_stack.pop() female = female_stack.pop() if male == x and female == y: print("第{}首曲子,{}号男生和{}号女生配对成功!".format(dance_count+1, x, y)) return else: dance_count += 1 if len(male_queue) > len(female_queue): male_stack.push(male) female_queue.append(female) else: female_stack.push(female) male_queue.append(male) if __name__ == '__main__': dance(5, 6, 2, 3) ``` 测试样输出: ``` 第1首曲子,1号男生和1号女生配对成功! 第2首曲子,3号男生和2号女生配对成功! 第3首曲子,4号男生和4号女生配对成功! 第4首曲子,5号男生和5号女生配对成功! 第5首曲子,2号男生和6号女生配对成功! ``` 说明: 在男女人数分别为5和6的情况下,第2个男生和第3个女生只有在第5首曲子时才可能配对成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值