L1-1 天梯赛座位分配 (20 分)

题目链接
在这里插入图片描述
在这里插入图片描述
水题,模拟就行

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;

int a[150], b[150];//a记录每个学校有几个队,b记录每个学校有几个人,由题意可知b[i]=a[i]*10
bool book[150];//标记该学校学生是否全部分配完
vector<int> e[150];//存学生座位号

int main(int argc, char const *argv[]) {
    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        cin >> a[i];
        b[i] = a[i] * 10;
    }
    int ans = t, k = 1, x = 1;//k模拟学校数,x模拟座位号
    while (ans) {
        if (book[k] == 0) {//如果该学校学生没有全部分配完成
            e[k].push_back(x);//压入
            b[k]--;//该学校学生数-1(已经分配完成一位)
            if (ans == 1)//如果最后还剩一个学校的话座位要隔开坐
                x += 2;
            else
                x++;
        }
        if (b[k] == 0 && book[k] == 0) {//如果有学校学生全部分配完毕
            book[k] = 1;//标记该学校已经完成分配
            ans--;//学校数-1
        }
        k++;//学校数+1
        if (k > t) k = 1;//保证学校数合法
    }
    for (int i = 1; i <= t; i++) {//输出
        printf("#%d\n", i);
        for (int j = 0; j < a[i] * 10; j++) {
            if (j % 10 == 0)
                printf("%d", e[i][j]);
            else
                printf(" %d", e[i][j]);
            if ((j + 1) % 10 == 0) printf("\n");
        }
    }
    return 0;
}
### L1-049 天梯赛座位分配 Java 实现 对于天梯赛座位分配问题,在处理过程中,核心在于如何高效地读取输入数据并合理安排考场以及考生的具体位置。为了提高效率,可以采用多种方法来优化程序性能。 #### 数据结构的选择 使用`HashMap<String, ArrayList<Integer>>`存储教室编号到该教室内所有可选座位列表之间的映射关系[^1]。这有助于快速定位特定教室内的可用座位情况,并支持高效的增删操作。 ```java import java.util.*; public class SeatArrangement { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = Integer.parseInt(scanner.nextLine().split(" ")[1]); // 教室数量 Map<String, List<Integer>> roomToSeats = new HashMap<>(); for (int i = 0; i < N; ++i){ String line = scanner.nextLine(); String roomId = line.substring(0, 8); // 假设房间ID长度固定为7位字符加上一个空格 List<Integer> seats = Arrays.stream(line.split(" ")) .skip(1) .map(Integer::parseInt) .collect(Collectors.toList()); Collections.sort(seats); roomToSeats.put(roomId.trim(), seats); } ... } } ``` #### 输入输出流的管理 为了避免频繁调用标准输入输出函数造成的时间开销,建议一次性获取全部输入内容后再进行解析;同样地,在输出最终结果时也应尽可能减少单独写入次数。 ```java StringBuilder outputBuffer = new StringBuilder(); // ... 在适当的地方构建outputBuffer ... System.out.print(outputBuffer.toString()); ``` #### 排序与二查找的应用 当需要查询某个学生应该被分配至哪个具体座位时,考虑到已经按照升序排列好了每间教室里的座位序列,则可以直接利用二法加速搜索过程,从而降低时间复杂度。 ```java private static int binarySearch(List<Integer> sortedList, int target) { int low = 0; int high = sortedList.size() - 1; while(low <= high){ int mid = (low + high) >>> 1; int valueAtMid = sortedList.get(mid); if(valueAtMid < target){ low = mid + 1; }else if(valueAtMid > target){ high = mid - 1; }else{ return mid; } } return -(low + 1); } ``` 通过上述措施,可以在保证正确性的前提下显著提升解决此类问题的速度表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值