蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票:::非常典型的比刷例题!!!)

news2024/11/26 18:30:17

别忘了请点个赞+收藏+关注支持一下博主喵!!!

关注博主,更多蓝桥杯nice题目静待更新:)

枚举与模拟

一、卡片:

【问题描述】                                                                                                                                           小蓝有很多数字卡片,每张卡片上都是一个数字(0到9)。                                                             小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其他数了。                                                                                                                                 小蓝想知道自己能从1拼到多少。                                                                                                       例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼 11时卡片1已经只有一张了,不够拼出11。                                                                                                                         现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到 多少? 提示:建议使用计算机编程解决问题。                                                                                                      【答案提交】                                                                                                                                               这是一道结果填空题,你只需要算出结果后提交即可。本题的结果作为一个整数,在 提交答案时只填写这个整数,填写多余的内容将无法得分

解析:

        本题思路较为简单,可直接从数字1开始往后枚举,枚举的同时检查剩下的卡片能不能 拼出当前枚举到的数字即可。                                                                                                                                定义cnt[i] 表示刻有数字i的卡片张数。那么按照题目的意思,初始化cnt[0∼9]=2021, 参考代码如下。

int cnt[10];
for(int i = 0 ; i <= 9 ; i++) cnt[i] = 2021;

        若我们将步骤拆分为两步,则可分为枚举、检查。枚举没什么问题,写个循环即可,但 该怎么检查呢?                                                                                                                                                  首先就需要把一个数在十进制下的每一位数字求出来。怎么求呢? 可以将该数对 10 取 模,这样就得到了个位上的数字;再除以10,这样原本十位上的数字就跑到了个位上;然后 再对10取模……反复这个过程,就可以得到这个数在十进制下所有数位上的数字了。

        得到数位上的所有数字后再看看这些数字对应的卡片够不够,不够的话就说明这个数拼 不了,就停止枚举,这样答案就为上一个枚举的数。

bool check(int x) { // x 表示当前枚举的数
    while (x) {
        int b = x % 10; // 获取十进制下的每个数位
        if (cnt[b] > 0) 
            cnt[b]--; // 这个数位对应的卡片个数 -1
        else 
            return false; // 如果卡片不够了,则无法拼凑出该数
        x /= 10; // 将十位变为个位
    }
    return true;
}

        至此,检查的模块就完成了。不过我们还可以进行一点小小的优化。                                                我们的枚举是从1开始的,如果分别看枚举数的个位、十位……上的数字,那么会得到 如下的内容。

        显然,个、十、百、千、万……每一数位的变化都是有周期性的。每个周期中各个数字出 现的次数都是相同的,且每一数位都是从1开始变化的。因此,刻有数字1的卡片一定会被 最早使用完,我们只需要对该卡片的张数作判断就好,具体代码可见参考代码第4∼14行。 

#include <bits/stdc++.h>
using namespace std;

int cnt[10];

bool check(int x) { // x 表示当前枚举的数
    while (x) {
        int b = x % 10; // 获取十进制下的每个数位
        if (b == 1) {
            if (cnt[1] == 0) return false;
            cnt[1]--;
        }
        x /= 10; // 将十位变为个位
    }
    return true;
}

signed main() {
    for (int i = 0; i <= 9; i++) cnt[i] = 2021;
    for (int i = 1;; i++) {
        if (!check(i)) return cout << i - 1 << '\n', 0;
    }
    return 0;
}

最终答案为3181。

二、回文日期:

【问题描述】                                                                                                                                      2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为 如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。                                                                                                                                                  有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年 之后就是下一个回文日期:20211202即2021年12月2日。                                                                                          也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文 日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日 期:21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。                                                                                   给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABAB BABA型的回文日期各是哪一天。                                                                                                                        【输入格式】                                                                                                                                             输入包含一个八位整数N,表示日期。 对于所有评测用例,10000101⩽N⩽89991231,保证N是一个合法日期的8位数表示。                                                                                                    【输出格式】                                                                                                                                              输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个ABAB BABA型的回文日期。                                                                                                                                      【样例输入】                                                                                                                                              20200202                                                                                                                              【样例输出】                                                                                                                                               20211202 21211212                                                                                                                  【答案提交】                                                                                                                                                这是一道结果填空题,你只需要算出结果后提交即可。本题的结果作为一个整数,在 提交答案时只填写这个整数,填写多余的内容将无法得分。

解析:

        根据题意,我们可以将题目拆解为如何判断回文和如何枚举日期两个部分来解决。

        1. 如何判断回文                                                                                                                                  对于一个8位数的整型日期,可以通过除法和取余运算来获取它的每一位数字。比如 

若整数date 的值为20050511,它从高到低的每一数位上的数可以通过下列方法得到。
• data / 10000000 = 2;
• data / 1000000 % 10 = 0;
• data / 100000 % 10 = 0;
• data / 10000 % 10 = 5;
• data / 1000 % 10 = 0;
• data / 100 % 10 = 5;
• data / 10 % 10 = 1;
• data % 10 = 1。

        对于本题,若用a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8] 分别存储每一位,则一个 回文日期须满足:         

一个ABABBABA 型回文日期须满足以下条件。       

a[1] = a[3] = a[6] = a[8]

                                                           a[2] = a[4] = a[5] = a[7].                                                         

        对于一个日期字符串,可以直接通过下标来获取它的每一位数字。例如,string date = “20050511”,它从高到低的每一位分别可以通过data[0],data[1],...,data[7] 得到。判断回文 日期及ABABBABA型回文日期的方式和上述方法类似。                                                                                      不难看出,字符串获取日期的每一位数字是要比整型简单的,所以在判断回文日期及 ABABBABA 型回文日期时可以将整型转换为字符串来操作,如参考代码所示。

#include <bits/stdc++.h>
using namespace std;

int date = 20050511;
string s = to_string(date); // 将整型转换为字符串, s = "20050511"

// 判断回文日期
bool check1(int date) {
    string s = to_string(date);
    if (s[0] == s[7] && s[1] == s[6] && s[2] == s[5] && s[3] == s[4])
        return true;
    return false;
}

// 判断 ABABBABA 型回文日期
bool check2(int date) {
    string s = to_string(date);
    if (s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && 
        s[1] == s[3] && s[1] == s[4] && s[1] == s[6])
        return true;
    return false;
}

         2. 如何枚举日期                                                                                                                                 对于一个整型日期,可以用最简单的方式枚举,即令该日期不断+1,直到出现满足ABAB BABA 型的回文日期。                                                                                                                                 但这样存在一个问题:会枚举出许多不合法的日期(如20209999)。为此,我们需要对 日期进行合法性判断:设y,m,d分别表示年、月、日,month[i]表示第i个月的天数,那么 当m12或dmonth[m]时日期不合法,反之日期合法,如参考代码所示。

#include <iostream>
#include <string>
using namespace std;

int month[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check(int date) {
    string s = to_string(date);
    //stoi->将字符串转为整型
    int y = stoi(s.substr(0, 4)), m = stoi(s.substr(4, 2)), d = stoi(s.substr(6, 2));

    if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) 
        month[2] = 29;
    else 
        month[2] = 28;

    if (m < 1 || m > 12 || d < 1 || d > month[m]) 
        return false;
    return true;
}

int main() {
    int date = 20050511;
    for (int i = date + 1;; i++) {
        if (!check(i)) continue;
        // 找到下一个有效日期后,可以在这里进行进一步处理
        // 例如,检查是否是回文日期或 ABABBABA 型回文日期
        cout << "Next valid date: " << i << endl;
        break;
    }
    return 0;
}

        不过这样的枚举量是相当大的,要在比赛中完成本题要求的所有测试数据不太现实。                      那么,还有什么枚举方法呢?                                                                                                              可以直接枚举合法日期。枚举合法日期只需模拟日期的变化规律即可,对应参考代码如 下所示。

#include <iostream>
using namespace std;

int month[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main() {
    int date = 20050511;
    int y = date / 10000, m = date / 100 % 100, d = date % 100;

    for (int i = y;; i++) {
        if (i % 400 == 0 || (i % 100 != 0 && i % 4 == 0)) 
            month[2] = 29; // 闰年2月有29天
        else 
            month[2] = 28;

        int j = (i == y) ? m : 1; // 如果是i = y,则月份从m开始枚举,否则从1开始枚举
        for (; j <= 12; j++) {
            int k = (i == y && j == m) ? d : 1; // 如果i = y并且j = m,则日从d开始枚举,否则从1开始枚举
            for (; k <= month[j]; k++) {
                int new_date = i * 10000 + j * 100 + k;
                // 在这里可以进行进一步处理,例如检查是否是回文日期或ABABBABA型回文日期
                cout << "Next valid date: " << new_date << endl;
                return 0; // 找到第一个有效日期后退出程序
            }
        }
    }

    return 0;
}

        我们还可以只枚举年份。因为答案一定是个回文日期(即回文串),所以枚举年份y,再 将其翻转得到y′,得到的y+y′就一定是个回文串,如下页图所示。接着再对该串所对应的 日期进行合法判断、ABABBABA型回文判断即可。

综上 :

枚举合法日期:
#include <bits/stdc++.h>
using namespace std;

int month[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int date, ans1, ans2;

// 判断日期是否为回文
bool check1(int date) {
    string s = to_string(date);
    if (s[0] == s[7] && s[1] == s[6] && s[2] == s[5] && s[3] == s[4])
        return true;
    return false;
}

// 判断日期是否满足 ABABBABA 型回文
bool check2(int date) {
    string s = to_string(date);
    if (s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && 
        s[1] == s[3] && s[1] == s[4] && s[1] == s[6])
        return true;
    return false;
}

signed main() {
    cin >> date;
    int y = date / 10000, m = date / 100 % 100, d = date % 100;

    for (int i = y;; i++) {
        if (i % 400 == 0 || (i % 100 != 0 && i % 4 == 0))
            month[2] = 29;
        else
            month[2] = 28;

        int j = (i == y) ? m : 1;
        for (; j <= 12; j++) {
            int k = (i == y && j == m) ? d + 1 : 1;
            for (; k <= month[j]; k++) {
                int new_date = i * 10000 + j * 100 + k;
                if (check1(new_date) && ans1 == 0)
                    ans1 = new_date;
                if (check2(new_date)) {
                    cout << ans1 << '\n' << new_date << '\n';
                    return 0; // 当找到了 ABABBABA 型回文日期时,结束程序
                }
            }
        }
    }

    return 0;
}
枚举年份:
#include <bits/stdc++.h>
using namespace std;

// month[1~12]分别记录1~12月每月的天数
int date, month[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 判断日期是否合法
string check(int date) {
    string s = to_string(date), t = to_string(date); // 将整型转换为字符串
    reverse(t.begin(), t.end()); // 翻转
    s += t; // 将s翻转后再与s拼接,拼接后的字符串一定会是个回文串
    int y = stoi(s.substr(0, 4)), m = stoi(s.substr(4, 2)), d = stoi(s.substr(6, 2));

    if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) 
        month[2] = 29;
    else 
        month[2] = 28;

    if (m < 1 || m > 12 || d < 1 || d > month[m]) 
        return "-1";
    return s;
}

// 判断日期是否是ABABBABA型回文
string check2(int date) {
    string s = to_string(date), t = to_string(date);
    reverse(t.begin(), t.end()); // 翻转
    s += t;
    if (s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && 
        s[1] == s[3] && s[1] == s[4] && s[1] == s[6]) 
        return s;
    return "-1";
}

signed main() {
    cin >> date;
    string ans1 = "";

    for (int i = date / 10000;; i++) {
        // 注意:date(输入的日期)不能作为答案
        if (check(i) == "-1" || check(i) == to_string(date)) continue;
        if (ans1 == "") ans1 = check(i);
        if (check2(i) != "-1") {
            cout << ans1 << '\n' << check2(i) << '\n';
            return 0;
        }
    }

    return 0;
}

三、赢球票:

【问题描述】                                                                                                                                              某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。                                                              主持人拿出N张卡片(上面写着1,...,N的数字),打乱顺序,排成一个圆圈。                                    你可以从任意一张卡片开始顺时针数数: 1,2,3...                                                                                  如果数到的数字刚好和卡片上的数字相同,则把该卡片收入囊中,从下一张卡片重新数数。            直到再无法收获任何卡片,游戏结束。囊中卡片数字的和就是赢得球票的张数。                              比如卡片排列是123,我们从1号卡开始数,就把1号卡拿走。再从2号卡开始, 但数的数字无法与卡片对上,很快数字越来越大,不可能再拿走卡片了。因此这次我们 只赢得了1张球票。                还不算太坏!如果我们开始就傻傻地从2或3号卡片数起,那就一张卡片都拿不 到了。                    如果运气好,卡片排列是213,那我们可以顺利拿到所有的卡片!                                                    本题目标:已知顺时针卡片序列,随便你从哪里开始数,求最多能赢多少张球票(就 是收入囊中的卡片数字之和)。                                                                                                              【输入格式】                                                                                                                                               第一行一个整数N(N⩽100),表示卡片数目。 第二行N个整数,表示顺时针排列的卡片。 【输出格式】                                                                                                                                               输出一行,一个整数,表示最好情况下能赢得多少张球票。                                                【样例输入】                                                                                                                                                3 123                                                                                                                                  样例输出】                                                                                                                                                1

解析:

比如: 

         这是一道十分经典的模拟题。刚着手解决本题时,可能绝大部分人都会提出4个问题。                     问题1. 题目给定的是一个环(圆圈),我们需要如何模拟在环上的移动呢?                                     问题2. 如何表示被拿走的卡片呢?                                                                                                       问题3. 从哪个位置(起点)开始数数能拿走最多的卡片呢?                                                               问题4. 游戏什么时候会结束呢? 下面依次对这4个问题进行分析。                                                     对于问题1:                                                                                                                                       对于在序列上的移动,如果想从当前位置顺时针移动到下一个位置,只要让下标+1即可。但当处于第n个位置时,由于没有第n+1个位置,所以无法移动。而对于环,第n+1 个位置即第1个位置,所以从第n个位置移动到下一个位置只要让下标为1即可,其他位置 的移动和序列相同。

         对于问题2:                                                                                                                                       可以对被拿走的卡片打上标记。定义flag[],其中flag[i]表示第i张是否被取走(flag[i]=1 表示被取走,flag[i]=0 表示没有被取走)。下图展示了第2张卡片被拿走的情况。 

         对于问题3:                                                                                                                                       不知道。既然不知道,就将每个位置都作为一次起点并模拟整个过程,再从中选出最大 的卡片和(即答案)。                                                                                                                                        对于问题4:                                                                                                                                        游戏结束分为以下两种情况。                                                                                                             • 取走所有的卡片(即取走n张卡片)。                                                                                             • 当前数的数大于n(不可能再取走卡片了)。                                                                                   解决了上述4个问题,就可以开始解题了。                                                                                         按照上面的分析,我们需要完成以下几点。                                                                                     (1)枚举起点,并在每次枚举了一个起点后将所有卡片的flag初始化为0。                                     (2)有了起点后就可以模拟数数的过程,流程图如下。 

        •判断游戏是否结束。                                                                                                                          •判断当前位置的卡片是否被取走(若被取走,则移动到下一个位置)。                                          •判断当前位置的卡片的值是否和数的数的值相同(相同则取走该卡片,并重新开始数 数)。                                                                                                                                                        •判断这次模拟得到的结果是否可以作为答案。 

代码如下:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e2 + 10;
int n, a[N], flag[N];

signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) 
        cin >> a[i];
    
    int ans = 0; // ans 表示答案
    
    for (int i = 1; i <= n; i++) { // i 表示枚举的起点
        // 将所有卡片的 flag 初始化为 0
        for (int j = 1; j <= n; j++) 
            flag[j] = 0; // flag[j] = 1 表示卡片被取走,反之没被取走
        
        int num = 1, pos = i, sum = 0, cnt = 0; 
        // num 表示数的数的值,pos 表示当前位置,sum 表示以 i 为起点数数所能取走的卡片的和,cnt 表示拿走的卡片的数量
        
        // 开始模拟
        while (1) {
            // 判断游戏是否结束
            if (cnt == n || num > n) 
                break; // 如果取走了所有卡片,或者数的数大于 n(不可能再取走卡片了),则游戏结束
            
            // 判断当前位置的卡片是否被取走
            if (flag[pos] == 1) { // 如果该卡片已被取走,则移动到下一个位置
                if (pos == n) 
                    pos = 1;
                else 
                    pos++;
                continue;
            }
            
            // 数的数和当前位置卡片的值相同时取走该卡片(a[pos] 表示第 pos 张卡片的值)
            if (num == a[pos]) {
                sum += a[pos]; // 取走卡片的和 + a[pos]
                cnt++; // 取走的卡片个数 + 1
                num = 1; // 取走卡片后要重新数数
                flag[pos] = 1; // 取走卡片后该卡片对应的 flag 置为 1
                
                // 移动到下一个位置
                if (pos == n) 
                    pos = 1;
                else 
                    pos++;
            } else {
                // 数的数和当前位置卡片的值不相同时
                num++; // 数的数的值 + 1
                
                // 移动到下一个位置
                if (pos == n) 
                    pos = 1;
                else 
                    pos++;
            }
        }
        
        // 模拟结束,判断该模拟结果是否可以作为答案
        if (sum > ans) 
            ans = sum;
    }
    
    cout << ans << '\n';
    return 0;
}

以上就是这次博客的内容了

别忘了请点个赞+收藏+关注支持一下博主喵!!!

关注博主,更多蓝桥杯nice题目静待更新:)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题:Spring(一)

1. Spring框架中bean是单例么&#xff1f; Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。 2. Spring框架中的…

InnoDB 存储引擎<七>通用表空间+临时表空间

目录 通⽤表空间 - General Tablespace 临时表空间 - Temporary Tablespaces 通⽤表空间 - General Tablespace 对应磁盘上的文件需要用户手动创建 1.通⽤表空间的作⽤和特性&#xff1f; 解答问题&#xff1a; 1.作用&#xff1a;可以把数据量比较小且强相关的表&#xff…

linux 通过apt安装软件包时出现依赖包版本不对的问题解决

通过网上查找解决办法时&#xff0c;发现的解决办法无法完美解决问题: 比如通过安装对应版本解决 如: sudo apt-get install xxx2.7.0ubuntu 这样会先卸载原先包&#xff0c;在安装对应版本的包 或者直接删除依赖的包 sudo apt-get purge xxxx 如果碰到底层包的话&#xf…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例,以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b)

提升电机控制的关键:东芝TB6605FTG深度解析

在电机控制领域&#xff0c;对高效、精确且可靠的组件的需求是不可忽视的。东芝的TB6605FTG正是一款具备这些特性的电机驱动IC&#xff0c;是工程师们在设计电机控制系统时的理想选择。 主要特性与规格 TB6605FTG的核心是一个三相全波电机驱动IC&#xff0c;专为无刷直流电机控…

动态规划理论基础和习题【力扣】【算法学习day.25】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

【K8S系列】K8S 集群 CPU 爆满导致 Pod Pending 状态的分析与解决方案

在 Kubernetes 集群中&#xff0c;CPU 突然爆满可能导致 Pod 状态变为 Pending&#xff0c;影响应用的可用性。本文将深入分析其原因&#xff0c;并附上相关命令及其执行结果&#xff0c;帮助你更好地理解和解决此问题。 1. 问题描述 在 Kubernetes 集群中&#xff0c;当 CPU …

开源代码管理平台Gitlab如何本地化部署并实现公网环境远程访问私有仓库

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 本文主要介绍如何在Linux CentOS8 中搭建GitLab私有仓库并且结合内网穿透工具实现在公网…

Linux磁盘存储

磁盘存储 设备文件 设备文件是类Unix操作系统&#xff08;包括Linux&#xff09;中一种特殊的文件类型&#xff0c;它代表了设备接口&#xff0c;使得用户空间的程序可以通过标准的文件操作来访问和控制硬件设备。设备文件为周边设备提供了简单的接口&#xff0c;如打印机、硬…

《重学Java设计模式》之 原型模式

原型模式主要解决的问题就是创建重复对象&#xff0c;而这部分对象内容本身比较复杂&#xff0c;生成过程可能从库或者RPC接口中获取数据的耗时较长&#xff0c;因此采用克隆的方式节省时间。 案例&#xff1a;上机考试抽题&#xff0c;要求打乱题目、答案数据 工厂结构 选择题…

C++【string类,模拟实现string类】

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: C专栏 目录 为什么学习string类 C语言中的字符串 标准库中的string类 auto和范围for auto关键字 迭代器 范围for string类的常用接口说明和使用 1. string类对象的常见构造 2.string类对象的容量操作 3…

《计算机网络》课后探研题书面报告_了解网络设备

引言 计算机网络自20世纪60年代首次提出以来&#xff0c;已经发展成为现代社会不可或缺的基础设施。最早的计算机网络仅用于连接少数设备&#xff0c;用于简单的数据传递与共享。随着互联网技术的迅速普及和计算机技术的飞跃发展&#xff0c;网络的规模和复杂性不断增加&#…

怎么搭建小程序商城

我是【码云数智】平台的黄导&#xff0c;今天分享&#xff1a;怎么搭建小程序商城 商城小程序怎么开通&#xff0c;通过微商城将线上线下渠道打通&#xff0c;消费者既可以在线上微商城随时随地浏览商品、下单购买&#xff0c;也可以选择到门店进行线下体验和购买。 01、小程…

git原理与上传

言&#xff1a; git是一个软件&#xff0c;gitee/github是一个网站&#xff0c;这里有什么联系吗&#xff1f;我们身为一个程序员不可能不知道github&#xff0c;但是毕竟这是外国的网站&#xff0c;我们不翻墙的情况下&#xff0c;是无法访问的(或者就是太慢了&#xff0c;或…

3DMax使用 MCG实现简单克隆修改器

3DMax中的MCG工具集允许用户创建几种不同类型的插件。在这个例子中&#xff0c;我们正在创建一个简单的克隆修改器。 将修改器添加到对象时&#xff0c;将使用“数量”整数值克隆网格n次&#xff0c;并使用X、Y和Z中的“缩放”、“旋转”和“移动”微调器控制每个网格的偏移。…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第二个BOSS燥郁的毛里克

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏第二个BOSS燥郁的毛里克 1.导入素材和制作相关动画1.5处理玩家受到战吼相关行为逻辑处理2.制作相应的行为控制和生命系统管理3.制作战斗场景和战斗…

springboot-整合多数据源配置

简介 主要介绍两种整合方式,分别是 springboot+mybatis 使用分包方式整合,和 springboot+druid+mybatisplus 使用注解方式整合。 一、表结构 在本地新建两个数据库,名称分别为db1和db2,新建一张user表,表结构如下: SQL代码: CREATE TABLE `user` (`id` int(11) NOT …

LeetCode 热题100 之 回溯1

1.全排列 思路分析1&#xff08;回溯&#xff09;&#xff1a;要生成一个不含重复数字的数组 nums 的所有可能全排列&#xff0c;我们可以使用回溯算法。这种算法通过递归的方法探索所有可能的排列组合&#xff0c;并在合适的时机进行回溯&#xff0c;确保不会遗漏任何排列。回…

笔记整理—linux驱动开发部分(4)驱动框架

内核中&#xff0c;针对每种驱动都设计了一套成熟的、标准的、典型的驱动框架&#xff0c;实现将相同部分实现&#xff0c;不同部分留出接口给工程师自行发挥。具有以下特点&#xff1a;①简单化&#xff1b;②标准化&#xff1b;③统一管控系统资源&#xff1b;④特定化接口函…

靠谷歌广告赚了100美刀,程序员可以照这个思路去干

复制网站盈利尝试&#xff1a;谷歌广告收入之路的挑战与反思 背景介绍 在互联网的浩瀚海洋中&#xff0c;网站复制现象屡见不鲜。近期&#xff0c;我尝试复制了一个名为网站B的核心代码&#xff0c;并成功发布了自己的网站。通过谷歌搜索引擎的优化&#xff08;SEO&#xff0…