做题笔记。

发布于:2025-06-28 ⋅ 阅读:(13) ⋅ 点赞:(0)

题目: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;
}