团队天梯赛L1-005. 考试座位号

本文介绍了一个简单的程序设计问题,即如何通过输入考生的试机座位号来查询其对应的考试座位号。程序首先读取所有考生的准考证号、试机座位号及考试座位号,然后根据输入的试机座位号查询并输出相应的考试座位号。
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。

输入样例:
4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4
输出样例:
10120150912002 2
10120150912119 1

#include <stdio.h>
  struct Stud          //定义结构体
  {
    char StuNum[15];
    int x;       //试机座位
    int y;       //考试座位
  };

  int main ()
{
  struct Stud Students[1010];      //定义结构体类型的数组
  int   i,j,k,m,StuN,SearchNum,search[1010];    //StuN  总人数  //SearchNum 查询人数

  scanf("%d", &StuN);   //输入总人数
  
  for(i=0;i<StuN;i++)    //输入学生数据
    scanf("%s%d%d",&Students[i].StuNum,&Students[i].x,&Students[i].y);
  
  scanf("%d",&SearchNum);      //输入查询人数
  
  for(m=0;m<SearchNum;m++)    
    scanf("%d",&search[m]);    //输入要查找的试机号
  
    for(j=0;j<SearchNum;j++)     // 双循环查找条件匹配的项目                              
      for(k=0;k<StuN;k++)
        if (Students[k].x==search[j])
          printf("%s %d\n",Students[k].StuNum,Students[k].y);  //输出符合条件的数据

     return 0;
}

### 天梯赛 L1-049 座位分配问题解析 天梯赛 L1-049 题目“座位分配”是一个考察队列操作与模拟逻辑的编程题。题目要求为多个学校的参赛队伍分配座位,确保同一学校的选手按照顺序入座,并且不同学校的选手不能相邻。当只剩下一个学校的选手时,需要隔位就坐。 #### 题目核心逻辑 1. **输入处理**: - 输入包含多个学校的队伍数量,每个学校每队有 10 名选手。 - 需要将所有选手按照顺序分配座位,座位编号从 1 开始。 2. **队列模拟**: - 每个学校的所有选手应排成一列纵队。 - 各校的第 1 位选手依次入座,然后是第 2 位,依此类推。 - 当只剩下一个学校时,该学校的剩余选手必须隔位就坐。 3. **输出要求**: - 每个选手的座位号按学校和队伍顺序输出。 #### 算法实现思路 可以使用一个**队列数组**来模拟每个学校的选手队列。具体步骤如下: 1. **初始化队列**: - 每个学校建立一个队列,队列中依次加入该学校所有队伍的选手(每队 10 人)。 2. **模拟分配过程**: - 使用一个循环,每次从每个学校的队列中取出一个选手进行分配。 - 如果某个学校的队列为空,则跳过。 - 如果只剩下一个非空队列,则开始“隔位就坐”模式。 3. **座位编号处理**: - 座位号1 开始递增。 - 在“隔位就坐”模式下,每次分配后跳过一个座位。 #### 示例代码 以下是一个基于上述逻辑的 C++ 实现示例: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<queue<int>> schools(n); int total = 0; for (int i = 0; i < n; ++i) { int m; cin >> m; for (int j = 0; j < m * 10; ++j) { schools[i].push(i + 1); // 标记学校编号 } total += m * 10; } vector<vector<int>> result(n); // 每个学校选手的座位号 int seat = 1; int remaining = n; while (total--) { bool hasPlayer = false; for (int i = 0; i < n; ++i) { if (!schools[i].empty()) { hasPlayer = true; if (remaining > 1) { result[i].push_back(seat++); schools[i].pop(); } else { result[i].push_back(seat); schools[i].pop(); seat += 2; // 隔位就坐 } } } if (hasPlayer) { remaining = 0; for (int i = 0; i < n; ++i) { if (!schools[i].empty()) remaining++; } } } for (int i = 0; i < n; ++i) { for (int j = 0; j < result[i].size(); ++j) { cout << result[i][j] << " "; } cout << endl; } return 0; } ``` #### 关键点说明 - **队列管理**:使用 `queue` 结构管理每个学校的选手队列,便于模拟“先进先出”的分配逻辑。 - **隔位就坐**:当只剩一个学校未分配完时,使用 `seat += 2` 实现隔位就坐。 - **输出格式**:按照学校顺序输出每个选手的座位号。 #### 总结 L1-049 是一个典型的模拟题,考察的是对队列、循环控制和条件判断的综合运用。掌握这种类型的题目有助于提升编程思维和算法设计能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值