题目来源
题目描述
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 求出,他的座位为第几列第几行。
输入格式
输入的第一行包含两个正整数 n,m,分别表示小 R 所在的考场座位的行数与列数。
输入的第二行包含 n×m 个正整数 a1,a2,…,an×m,分别表示小 R 所在的考场的所有考生 CSP-J 2025 第一轮的成绩,其中 a1 为小 R CSP-J 2025 第一轮的成绩。
输出格式
输出一行两个正整数 c,r,表示小 R 的座位为第 c 列第 r 行。
输入输出样例
输入 #1复制
2 2 99 100 97 98
输出 #1复制
1 2
输入 #2复制
2 2 98 99 100 97
输出 #2复制
2 2
输入 #3复制
3 3 94 95 96 97 98 99 100 93 92
输出 #3复制
3 1
说明/提示
【样例 1 解释】
按照成绩从高到低的顺序,成绩为 100 的考生的座位为第 1 列第 1 行,成绩为 99 的考生的座位为第 1 列第 2 行,成绩为 98 的考生的座位为第 2 列第 2 行,成绩为 97 的考生的座位为第 2 列第 1 行。小 R 的成绩为 99,因此座位为第 1 列第 2 行。
【样例 2 解释】
按照成绩从高到低的顺序,成绩为 100 的考生的座位为第 1 列第 1 行,成绩为 99 的考生的座位为第 1 列第 2 行,成绩为 98 的考生的座位为第 2 列第 2 行,成绩为 97 的考生的座位为第 2 列第 1 行。小 R 的成绩为 98,因此座位为第 2 列第 2 行。
【数据范围】
对于所有测试数据,保证:
- 1≤n≤10, 1≤m≤10;
-
对于所有 1≤i≤n×m,均有 1≤ai≤100,且 a1,a2,…,an×m 互不相同
代码
#include<bits/stdc++.h>
using namespace std;
int n[15][15];
int a[105];
int main(){
int n,m,h;
cin>>n>>m;
int i1=1,j1=1;
for(int i=1;i<=n*m;i++){
cin>>a[i];
}
int num=a[1];
sort(a+1,a+n*m+1);
for(int i=1;i<=n*m;i++){
if(a[i]==num){
h=i;
}
}
h=n*m-h+1;//求小R第几;
for(int i=1;i<h;i++){
if(i1%2==1&&j1<n){//当行数为单数时,列数++;
j1++;
}
else if(i1%2==1&&j1==n){//当行数为单数时,并且到头(j1==n),行数加一;
i1=i1+1;
}
else if(i1%2==0&&j1>1){//当行数为双数时,列数--;
j1--;
}
else{//当行数为双数时,并且到头(j1==1),行数加一;
i1=i1+1;
}
}
cout<<i1<<" "<<j1;
return 0;
}
CSP-J 2025 座位分配问题解析
1007

被折叠的 条评论
为什么被折叠?



