nefu高级语言设计之队列

本文包含三个编程题目,第一题是模拟舞会中的舞伴配对问题,使用队列实现;第二题是小朋友报数游戏,最后留下的人的编号;第三题是寻找最小平均等待时间的排队顺序,利用优先队列优化。这些题目考察了循环、队列操作和算法优化能力。

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

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

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

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

Sample Input
2 4
6

Sample Output
1 1
2 2
1 3
2 4
1 1
2 2

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int n, m; //表示男女人数
	int k = 0; //表示舞曲数目
	while (cin >> n >> m >> k)
	{
		queue<int>v;
		queue<int>u;
		for (int i = 1; i <= n; i++)
		{
			v.push(i);
		}
		for (int i = 1; i <= m; i++)
		{
			u.push(i);
		}
		for (int i = 1; i <= k; i++)
		{
			cout << v.front() << " " << u.front()<<endl;
			v.push(v.front());
			u.push(u.front());
			v.pop();
			u.pop();
		}
	}

	return 0;

}

2. Description
n个小朋友们坐成一个圆圈,编号分别为1,2,3…n;第1个小朋友从1开始报数,报到m的小朋友离开座位;然后下一个小朋友从1接着报数;直到剩下最后一个小朋友为止;

Input
输入2个数字n和m;(1<=n,m<=1000)

Output
输出最后一个小朋友的编号!

Sample Input
10 5

Sample Output
3

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		queue<int>v;
		for (int i = 1; i <= n; i++)
		{
			v.push(i); //读入小朋友编号
		}
		int count = 1;
		while (v.size() != 1)
		{
			if (count == m)
			{
				v.pop();
				count = 0;
			}
			else
			{
				v.push(v.front());
				v.pop();
			}
			count++;
		}
		cout << v.front() << endl;
	}
}

3. Description
林大食堂非常拥挤,得排队买饭,陈老师也是一样的!
有n个人在一个卖饭窗口前排队买饭,假如每个人买饭的时间为t,请编程找出一种这n个人排队的顺序,使得这n个人的平均等待时间最小。

Input
第一行一个n(1<=n<=1000),
第2行分别表示每人的接水时间t1,t2,t3,…tn,1<=t[i]<=10000;

Output
第1行为排队顺序;
第2行为平均等待时间(结果保留2位小数);

Sample Input
10
56 12 1 99 1000 234 33 55 99 812

Sample Output
3 2 7 8 1 4 9 6 10 5
291.90

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct sa
{
    int time;
    int id;
};
bool operator < (const sa& a, const sa& b)
{
    if (a.time != b.time)
        return a.time > b.time;
    else
        return a.id > b.id;
}
priority_queue<sa>vis;

int main()
{
    int n, x;
    double sum = 0.0;
    while (cin >> n)
    {
        for (int i = 1; i <= n; i++)
        {
            cin >> x;
            vis.push({ x,i });
        }
        struct sa tmp;
        for (int i = 1; i <= n; i++)
        {
            tmp = vis.top();
            if (i != n)
                cout << tmp.id << " ";
            else
                cout << tmp.id << endl;
            sum += (n - i) * tmp.time;  //计算总和
            vis.pop();
        }

        printf("%.2lf\n", sum / n);
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值