A17435. 座位(seat)
题目描述
座位(seat)
题目描述
CSP-J 2025 第二轮正在进行。小 R 所在的考场共有 n * m 名考生,其中所有考生的 CSP-J 2025 第一轮成绩互不相同。所有 n * m 名考生将按照 CSP-J 2025 第一轮的成绩,由高到低蛇形分配座位,排列成 n 行 m 列。具体地,设小 R 所在的考场的所有考生的成绩从高到低分别为 s1 > s2 >⋯> sn×m, 则成绩为 s1 的考生的座位为第 1 列第 1 行,成绩为 s2 的考生的座位为第 1 列第 2 行,……,成绩为 sn 的考生的座位为第 1 列第 n 行,成绩为 sn+1 的考生的座位为第 2 列第 n 行,……,成绩为 s2n 的考生的座位为第 2 列第 1 行,成绩为 s2n+1 的考生的座位为第 3 列第 1 行,以此类推。
例如,若 n=4,m=5,则所有 4*5=20 名考生将按照 CSP-J 2025 第一轮成绩从高到低的顺序,根据下图中的箭头顺序蛇形分配座位。

给定小 R 所在的考场座位的行数 n 与列数 m,以及小 R 所在的考场的所有考生 CSP-J 2025 第一轮的成绩 a1,a2,...,an×m,其中 a1 为小 R CSP-J 2025 第一轮的成绩,你需要帮助小 R 求出,他的座位为第几列第几行。
输入格式
从文件 seat.in 中读入数据。
输入的第一行包含两个正整数 n,m,分别表示小 R 所在的考场座位的行数与列数。
输入的第二行包含 n * m 个正整数 a1,a2,...,an×m,分别表示小 R 所在的考场的所有考生 CSP-J 2025 第一轮的成绩,其中 a1 为小 R CSP-J 2025 第一轮的成绩。
输出格式
输出到文件 seat.out 中。
输出一行两个正整数 c,r,表示小 R 的座位为第 c 列第 r 行。
样例 1 输入
2 2
99 100 97 98样例 1 输出
1 2样例 1 解释
按照成绩从高到低的顺序,成绩为 100 的考生的座位为第 1 列第 1 行,成绩为 99 的考生的座位为第 1 列第 2 行,成绩为 98 的考生的座位为第 2 列第 2 行,成绩为 97 的考生的座位为第 2 列第 1 行。小 R 的成绩为 99,因此座位为第 1 列第 2 行。
样例 2 输入
2 2
98 99 100 97样例 2 输出
2 2样例 2 解释
按照成绩从高到低的顺序,成绩为 100 的考生的座位为第 1 列第 1 行,成绩为 99 的考生的座位为第 1 列第 2 行,成绩为 98 的考生的座位为第 2 列第 2 行,成绩为 97 的考生的座位为第 2 列第 1 行。小 R 的成绩为 98,因此座位为第 2 列第 2 行。
样例 3 输入
3 3
94 95 96 97 98 99 100 93 92样例 3 输出
3 1数据范围
对于所有测试数据,保证:
1≤n≤10,1≤m≤10;
对于所有 1≤i≤n×m,均有 1≤ai≤100,且 a1,a2,…,a n×m 互不相同。
特殊性质 A:对于所有 1≤i≤n×m,均有 ai=i。
特殊性质 B:对于所有 1≤i≤n×m,均有 ai=n×m−i+1。
参考答案
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, a, a1, k = 1;
cin >> n >> m >> a1;
for (int i = 1; i < n*m; i++) {
cin >> a;
if (a > a1) k++;
}
int lie = ceil(1.0 * k / n);
int g = k % n;
if (g == 0) g = n; //特殊情况
int hang;
if (lie % 2 == 0) { //偶数列:从下往上排
hang = n - g + 1;
} else { //奇数列:从上往下排
hang = g;
}
cout << lie << " " << hang;
return 0;
}