题目:MT2021跳蚤
菜地上挖了𝑛n行𝑚m列个坑,有一只跳蚤可以从任意一个坑作为起点无限次跳跃,同一个坑也可以重复跳到,但跳蚤只能垂直或者水平方向跳坑,而且不能跳到菜地外(这时候它会改变方向保证自己不掉出去或者停止)。每一跳距离固定为𝑠s个坑,当𝑠s为1表示跳到垂直或者水平方向紧相邻的隔壁坑里。求跳蚤可以从多少个不同的坑起跳,可以满足能在菜地里到达的坑数量为最大。
格式
输入格式:
三个整数𝑛,𝑚,𝑠n,m,s
输出格式:
一个整数,起点的数量
样例 1
输入:
2 3 1
输出:
6
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m, s;
cin >> n >> m >> s;
long long x=0,y=0;
x=((n-1)/s+1)*((n-1)%s+1);
y=((m-1)/s+1)*((m-1)%s+1);
cout << x*y << endl;
return 0;
}
知识点
在编程和数学场景里,向下取整(Floor) 主要用于这些情况,结合你这道题的网格跳跃场景,再延伸举些例子好理解:
1. “按固定步长拆分,取完整段数”场景
就像题目里的网格行列计算:
- 比如 n 行,每次跳 s 个坑,算“垂直方向最多能完整跳几次 s 步”,就用 (n-1) / s (C++ 里整数相除默认向下取整 )。
类似的:
- 分蛋糕:10 块蛋糕,每人分 3 块, 10/3=3 (向下取整),表示最多能完整分给 3 个人。
- 数组分段:数组长度 15,每段存 4 个元素, 15/4=3 (向下取整),表示有 3 个完整段,剩下的不足一段。
2. “限制最大值,取不超过目标的整数”场景
- 比如游戏里“经验值换算等级”:经验 123,每 50 经验升 1 级, 123/50=2 (向下取整),表示当前是 2 级(因为 2×50=100 ≤123,3×50=150>123 )。
- 温度转换(假设特殊规则):比如“温度值除以 10 向下取整作为区间”,23.9℃ 会被归到 23.9/10=2 (向下取整)的区间。
3. “处理负数,保持‘不大于原数’逻辑”场景
向下取整对负数更特殊,比如:
- -2.3 向下取整是 -3 (因为 -3 是不大于 -2.3 的最大整数 )。
- 场景:比如“财务负数支出的分段计算”,-5.2 元按每段 -2 元拆分, -5.2 / -2 = 2.6 ,但向下取整后是 2 (因为要找不大于 2.6 的最大整数 ),不过实际业务里要结合逻辑,这里主要是体现负数向下取整的特性。
4. “网格、坐标相关的边界/步长计算”(和题目强相关)
除了题目里的行列跳跃,类似的:
- 地图网格移动:地图是 10×10 格子,角色每次横向移动 3 格,算“从第 8 列出发,最多能向左完整移动几次”, (8-1)/3=2 (向下取整),表示能完整移动 2 次(对应题目里计算可达坑数的逻辑 )。
- 像素处理:图片宽 120 像素,每 30 像素切一块, 120/30=4 (向下取整),表示能切 4 块完整的。
简单总结:只要你需要“把一个数按固定规则拆分,只取‘完整的段数’,或者找‘不大于原数的最大整数’”,就可以用向下取整 。尤其是涉及网格、步长、分段计算的场景(像这道题的行列跳跃),向下取整能帮你简洁地处理“最多能跳多少次、覆盖多少坑”的逻辑~
题目:MT2025工厂
有一家工厂,在一天的开始时,共有𝑥x瓶罐头,在这一天结束时,会生产𝑥x mod 𝑚m瓶罐头。
现在已知第一天所拥有的罐头数𝑎a,以及𝑚m的值。请问,是否存在一个时刻,整个工厂会停止生产(𝑥x mod 𝑚m = 00)?
格式
输入格式:
两个数𝑎,𝑚a,m。
输出格式:
当生产会停止时,输出Yes
,否则输出No
。
样例 1
输入:
1 5
输出:
No
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a,m;
cin>>a>>m;
while(a%m!=0){
a+=a%m;
if(a>4e5){
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, m;
cin >> a >> m;
if (a % m == 0) {
cout << "Yes";
return 0;
}
for (int i = 1; i <= 10000; i++) {
a += a % m;
if (a % m == 0) {
cout << "Yes";
return 0;
}
}
cout << "No";
return 0;
}
题目:MT2031排队
课间休息做游戏,要求男孩们和女孩们排成一队,最初按照加入队伍的顺序排。然而,过了一会儿,站在女孩们前面的男孩们开始感到尴尬,下一秒,他们会让身后的女孩站到自己前面。
让我们更精确地描述这个过程。假设队列中的位置由11到𝑛n的整数顺序编号,我们对位置号11中的人首先进行操作。如果在时间𝑋X,男孩站在第𝑖i个位置,女孩站在第𝑖+1i+1个位置,然后下一秒,男孩女孩的位置会交换,也就是此时第𝑖i个是女孩,第𝑖+1i+1个是男孩。时间是以秒为单位给出的。
你现在知道孩子们的初始位置。确定队列在𝑇T秒之后的排列方式。
格式
输入格式:
第一行包含两个整数𝑛n和𝑡t,表示队列中的人数和队列将转换成需要查找的排列的时间;
下一行输入一个字符串𝑠s,𝑠s仅由𝐵B和𝐺G构成(B表示男孩,G表示女孩)。
输出格式:
一个字符串,表示最后的队列。
样例 1
输入:
5 1 BGGBG
输出:
GBGGB
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,t,B,G;
cin>>n>>t;
string s;
cin>>s;
for(int j=1;j<=t;j++){
for(int i=0;i<n-1;i++){
if(s[i]=='B'&&s[i+1]=='G'){
swap(s[i],s[i+1]);
i++;
}
}
}
cout<<s;
return 0;
}