TB椰程 TypeBuddy 打字搭子

2025 座位 · 方案二 直接算排名

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

数出排名,列号和行号两行算式搞定

  • 2025
  • 数学

正文

// CSP-J 2025 复赛 T2 · 座位(方案二 · O(1))
// 原题:https://oj.yecheng.tv/p/CSP2025JB
//
// 方案二 · 直接算排名,不用排座位
// 完全不用填表。小 R 的成绩是 a1,数一数有多少个成绩比它高,
// 就得到他的排名 p(从 1 开始数)。剩下的就是一道算术题:
//   每一列正好坐 n 个人,所以列号 c = (p - 1) / n + 1;
//   在这一列里是第几个(从 0 开始)就是 t = (p - 1) % n;
//   奇数列是从上往下坐的,行号 r = t + 1;
//   偶数列是从下往上坐的,行号 r = n - t。
// 复杂度 O(n*m),只用来数排名,比排序还省。

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

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

    int n, m;
    cin >> n >> m;
    int total = n * m;
    int mine, x;
    cin >> mine;

    int higher = 0;                          // 比小 R 成绩高的人数
    for (int i = 1; i < total; i++) {
        cin >> x;
        if (x > mine) higher++;
    }

    int p = higher + 1;                      // 小 R 的排名,从 1 开始
    int c = (p - 1) / n + 1;                 // 第几列
    int t = (p - 1) % n;                     // 在这一列里排第几个(从 0 开始)
    int r = (c % 2 == 1) ? (t + 1) : (n - t);

    cout << c << " " << r << "\n";
    return 0;
}

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

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