周末舞会

1.【问题】

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

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

【输入格式】

第 1 行两个正整数,表示男士人数 m 和女士人数 n,1≤m,n≤1000;
第 2 行一个正整数,表示舞曲的数目 k,k≤1000。

【输出格式】

共 k 行,每行两个数,之间用一个空格隔开,表示配对舞伴的序号,男士在前,女士在后。

【输入样例】

2 4
6

【输出样例】

1 1
2 2
1 3
2 4
1 1
2 2

2.【问题分析】

1.舞伴配对的顺序符合“先进先出”,
2.用两个队列分别存放男士队伍和女士队伍
3.模拟 k 次配对:每次取各队队头元素“配对”输出,并进行“出队”和重新“入队”操作。

3.1【程序及备注】-queue实现

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int m,n,k;
    cin>>m>>n>>k;
    queue<int> man;
    queue<int> women;
     
    for(int i=1;i<=m;i++) man.push(i);
    for(int i=1;i<=n;i++) women.push(i);
    for(int i=1;i<=k;i++) //循环k轮,也就是k首舞曲。
    {
        cout<<man.front()<<" "<<women.front()<<endl; //输出队头,也就是跳舞的人。
        int tmpm=man.front(); //记录队头。
        int tmpw=women.front(); //同上。
        man.pop(); //出队。
        women.pop(); //同上。
        man.push(tmpm); //使刚才的队头到队尾。
        women.push(tmpw); //同上。
    }
    return 0;
}

 

3.2【程序及备注】-数组模拟队列

#include<iostream>
using namespace std;

const int length=1100;
int a[length],b[length];
int main(){
    int m,n,k;
    cin>>m>>n>>k;
    for(int i=1;i<=m;i++){
        a[i] = i;
    }
    for(int i=1;i<=n;i++){
        b[i] = i;
    }
    int appenda=m,appendb=n;
    for(int i=1;i<=k;i++){
        cout<<a[i]<<" "<<b[i]<<endl;
        appenda++;
        a[appenda]=a[i];
        appendb++;
        b[appendb]=b[i];
    }
}

 

4.【运行结果】

 

posted @ 2020-07-13 09:05  new-code  阅读(784)  评论(0)    收藏  举报