CF748A Santa Claus and a Place in a Class 题解

Content

圣诞老人坐在一个桌子被摆成 \(m\)\(n\) 列的教室里。每个桌子有两个座位,每个位置从左往右都有编号,依次为 \(1,2,3,...,2\times n\times m\)。已知圣诞老人坐在编号为 \(k\) 的位置,求:

  • 圣诞老人坐在第几列第几行。
  • 圣诞老人的座位是在桌子的左边还是右边。

数据范围:\(1\leqslant n,m\leqslant 10000,1\leqslant k\leqslant 2\times 10^8\)\(2\times n\times m\) 的最大值)。

Solution

首先,我们可以求出圣诞老人在第几列第几行。

我们不妨把一个桌子看成一个集体,然后这样编号:从第一列第一行开始,先从前往后,再从左往右,依次编号为 \(1,2,3,...,n\times m\)。那么,我们发现,圣诞老人此时的编号 \(s\) 就是 \(\left\lceil\dfrac{k}{2}\right\rceil\)。然后我们可以根据这个来求出列数和行数,分别是 \(\left\lceil\dfrac{s}{m}\right\rceil\)\(\begin{cases}m&m\mid s\\s\mod m&m\nmid s\end{cases}\)

至于在左在右的问题,那就更简单了:如果 \(k\) 是奇数,那么就应该坐在桌子的左边,否则就应该坐在桌子的右边。

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;

int n, m, k, mm, r, l;

int main() {
	scanf("%d%d%d", &n, &m, &k);
	mm = (int)ceil(k / 2.0);
	r = (int)ceil(mm * 1.0 / m), l = (mm % (m + 1) + 1);
	printf("%d %d %c", r, l, (k % 2 ? 'L' : 'R'));
}
posted @ 2021-12-21 20:11  Eason_AC  阅读(30)  评论(0)    收藏  举报