TB椰程 TypeBuddy 打字搭子

2025 座位 · 方案一 把座位表填出来

CSP-J 标程 · 复赛真题 · 代码 · cpp · 难度 2/5 · 共 1257 字

按蛇形走位把成绩填进表格再查找

  • 2025
  • 模拟

正文

// CSP-J 2025 复赛 T2 · 座位
// 原题:https://oj.yecheng.tv/p/CSP2025JB
// 题意:n 行 m 列共 n*m 名考生,成绩互不相同。按成绩从高到低蛇形分配座位:
// 先从上往下填满第 1 列,再从下往上填满第 2 列,再从上往下填满第 3 列……
// 已知第一个成绩 a1 是小 R 的成绩,问小 R 坐在第几列第几行。
//
// 方案一 · 老老实实把座位表填出来
// 先把所有成绩从大到小排序,再按蛇形的走位把成绩一个个填进 seat[行][列],
// 最后在表里找 a1 在哪一格。
// 蛇形的走位很好写:列号 c 从 1 到 m,奇数列行号从 1 到 n,偶数列行号从 n 到 1。
// n、m 都只有 10,怎么填都很快。

#include <bits/stdc++.h>
using namespace std;

int seat[15][15];

int main() {
    freopen("seat.in", "r", stdin);
    freopen("seat.out", "w", stdout);

    int n, m;
    cin >> n >> m;
    int total = n * m;
    vector<int> sc(total);
    for (int i = 0; i < total; i++) cin >> sc[i];
    int mine = sc[0];

    sort(sc.begin(), sc.end(), greater<int>());

    int idx = 0;
    for (int c = 1; c <= m; c++) {
        if (c % 2 == 1) {                    // 奇数列:从上往下
            for (int r = 1; r <= n; r++) seat[r][c] = sc[idx++];
        } else {                             // 偶数列:从下往上
            for (int r = n; r >= 1; r--) seat[r][c] = sc[idx++];
        }
    }

    for (int r = 1; r <= n; r++) {
        for (int c = 1; c <= m; c++) {
            if (seat[r][c] == mine) {
                cout << c << " " << r << "\n";
                return 0;
            }
        }
    }
    return 0;
}

CSP-J 标程 · 复赛真题的其它内容

打字首页 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK