备战 清华大学 上机编程考试-冲刺前50%,倒数第5天

T1:多项式求和

小K最近刚刚习得了一种非常酷炫的多项式求和技巧,可以对某几类特殊的多项式进行运算。非常不幸的是,小K发现老师在布置作业时抄错了数据,导致一道题并不能用刚学的方法来解,于是希望你能帮忙写一个程序跑一跑。给出一个 \(m\) 阶多项式\(\(f(x)=\sum_{i=0}^mb_ix^i\)\)对给定的正整数 \(a\) ,求\(\(S(n)=\sum_{k=0}^na^kf(k)\)\)由于这个数可能比较大,所以你只需计算 \(S(n)\) 对 \(10^9+7\) 取模后的值(即计算除以 \(10^9+7\) 后的余数)。

解:

涉及到:a*b整数相乘的优化, a^n的优化,

多项式的计算-一个for循环,

自然数的幂次求和公式-数学推导

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<stdio.h>
#include<stdlib.h>

using namespace std;
//计算多项式的值的题目:

//“轩轩”前辈的代码非常值得学习,故而尝试 自己 默记着 尝试复写

long long int n,m,a;
long long int mod = 1e9+7;
long long int *b;  //作为数组,之后可以开辟空间

//处理输入的函数:
void init_input()
{
    //给上述变量赋值 和 处理b0 - bn
    cin>>n>>m>>a;
    b = new  long long int[m+1];
    for(int i = 0 ;i<=m ;i++)
    {
        cin>>b[i];
    }
}

//处理 (a*b)%mod 的快速算法:
long long multiply(long long a,long long b , long long mod)
{
    long long ans = 0;
    //我觉得这里还可以优化:让b是那个小的数
    if(b > a)
    {
        long long tmp = b;
        b = a;
        a = tmp;
    }

    while(b > 0)
    {
        if(b&1 != 0)
        {
            //b是一个奇数:
            ans = (ans + a)%mod;
        }
        a = (a<<1 ) % mod;
        b = b>>1;
    }
    return ans;
}


//处理 a^n次方的 快速算法:
long long power(long long a, long long n , long long mod)
{
    long long ans = 1 ;
    //计算a的n次方:

    while(n > 0 )
    {
        if(n&1 != 0)
        {
            //奇数:
            ans = multiply(ans,a,mod);
        }
        n = n>>1;
        ans = multiply(ans,ans,mod);
    }
    return ans;
}


//计算 f(k) 的结果:
long long func(long long x)
{
    long long ans = 0;
    //而且,我觉得可以改进一点, 求x的i次方,可以用到x的i-1次方
    long long tmp = 1;
    for(long long  i = 0 ; i<=m ;i++)
    {
        ans = (ans + multiply(tmp,b[i],mod))%mod;
        tmp = multiply(tmp,x,mod) % mod ; 
    }
    return ans;
}



//最后,计算S(n)的求和结果
long long Sum()
{
    long long ans = 0;
    
    //改进:保留 a的k-1次方的结果:
    long long tmp = 1;
    for(long long  i = 0 ; i<=n ;i++)
    {
        ans = (ans + multiply(func(i),tmp,mod))%mod;
        tmp = (multiply(tmp,a,mod))%mod;

    }
    return ans;
}


int main()
{

    //处理输入:
    // int n,m,a;
    // cin>>n>>m>>a;

    // vector<int> vec(m+1,0);
    // for(int i= 0; i<= m; i++)
    // {
    //     cin>>vec[i];
    // }
    
    //朴素一点的方法进行计算——先做一个垃圾出来:
    //第一步:需要一个计算f(k) % mod
    //第二步:再计算S(n)

    //可以改进的地方:
    //1.(a*b)%mod 可以利用 2的幂次 以及 左移,右移优化
    //2.计算a^k次方, 可以利用 2的幂次进行优化
    //其他的话,暂时就只能那样子了

    init_input();
    cout<<Sum()<<endl;

    //虽然,样例9 和 样例10 我肯定是做不出来的,
    //但是,只要过了一些样例,就有分,为啥不干脆 “针对样例编程”?
    //要有针对性! -- 得分为王
    
    //第一:针对 a = 1的情况, —— 只要算f(k)求和即可
    //这里一定有更加高效的计算-可以合并 - 分治等
    //目前我的想法只有合并:
    if(a == 1)
    {
        //但是如果要开辟一个10^9次方的数组的话,开辟不了
        //nice,合并之后,感觉因为m很小,复杂度可以降低到O(n)
        //甚至,只要知道1次求和,2次求和,3次求和,4次求和公式。。。。妙!
        //参考:https://www.bilibili.com/read/cv11243219/
        //这个问题就是 “自然数”幂等和问题:
        //根据这个参考文章,基本就可以搞定所有a=1的case了
        //数学的美妙就在其中,而清华,必然是招收能够体会数学之美的学生
        //这里以m=2 , a =1 那个测试用例进行写代码:
        if(a == 1 && m==2)
        {   //别忘了 0 的 0次方是 1
            long long sum = (b[0]*(n+1) %mod+b[1]*(n*(n+1)/2)%mod+ b[2]*(n*(n+1)*(2*n+1)/6)%mod)%mod;
            cout<<sum<<endl;
        }

    }



    return 0 ;
}
T2:葱的战争--模拟题

一个n乘m的棋盘,上面有k根葱,每根葱面朝方向为d(0123分别表示上下左右),没跟葱一个战斗力f。每隔时间葱会向面朝方向走一格,如果遇到棋盘边界,那么他将把面朝方向转180度(此回合葱不会走动),如果某个时刻有两个或以上的葱在同一位置,那么他们将发生战争,只有战斗力最高的葱存活,其他的葱全部原地枯萎,不在走动,求经过t时间后所有葱的位置

输入:第一行n m k,然后接下来k行每根葱的信息x y d f(坐标,方向,战斗力),最后一行输入时间t 输出:k行,分别表示每个葱的位置。 数据范围:n和m在100内,k在1000内,t在1000内,f在1000内,保证初始每颗葱位置不同,战斗力不同。

解:

结合之前的开发经验,这一题和 “贪吃蛇”的项目基本类似:

直接使用 模拟的思想,——关键是记录 board[][]和 snake里面的数据:

测试用例:

输入:
5 4 2
1 1 3 10
3 1 2 5
3
输出:
4 1 
2 1

#include<iostream>
#include<string>
#include<vector>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

struct cong
{
    int x;
    int y;
    int d;
    int f;
    //尝试写一个默认构造函数:
    cong()
    {
        this->x =0;
        this->y =0;   
        this->d =0;
        this->f =0;
    }
};

int n,m,k;
int t;

//算了,如果是二维数组的话,我还是老老实实的用int a[100][100]
//或者vector<vector<int> > vec(n,vector<int>(m,0))这种

int main()
{
    //这个就是一个简单的 模拟题目 搞定即可:
    //最关键一个点可能就是 数据如何存储的问题
    //处理输入 和 存储结构
    cin>>n>>m>>k;
    cong arr[1001];

    int flag[1001]; //用于记录这根是否存活,只有flag==0时,才需要更新
                    //cong的下标是从1开始用的
    for(int i = 1;i <=k ;i++) //arr从1开始用!!!cong的下标
    {
        cin>>arr[i].x>>arr[i].y>>arr[i].d>>arr[i].f;
    }
    cin>>t;

    //直接模拟t个时间-for循环-立即更新board数据 和 arr数据
    for(int i=1;i <=t ;i++)
    {
        //这里,设置一个board二维矩阵,nxm位置初始为0
        //之后,每次更新一个 活着的cong,在更新后的那里写上cong的下标
        //如果原来那个位置有非0的下标——>战斗->f小的那个flag设置为1,
        //坐标范围(0-n-1,0-m-1)
        //到达边界,下一个回合进行扭转,扭转也算做一步

        int board[101][101]; // 下标从0开始用,我估计是
        //调用
        for(int j = 1; j<=k;j++)
        {
            if(flag[j] != 0)
            {
                continue; //这根cong已经 不活了
            }
            //--否则进行更新:

            //上:
            if(arr[j].d == 0)
            {
                //是否到达上边界:
                if(arr[j].y == m-1) //我就按照正常的笛卡尔坐标来!之前那个贪吃蛇有点不同
                {
                    //修改arr[j].d即可
                    arr[j].d = 1;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    }
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }
                }
                else{
                    //向上移动1格:
                    arr[j].y +=1;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    } 
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }

                }
            }

            //下:
            else if(arr[j].d == 1)
            {
                //是否到达下边界:
                if(arr[j].y == 0) //我就按照正常的笛卡尔坐标来!之前那个贪吃蛇有点不同
                {
                    //修改arr[j].d即可
                    arr[j].d = 0;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    }
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }
                }
                else{
                    //向下移动1格:
                    arr[j].y -=1;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    } 
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }

                }
            }


            //左:
            else if(arr[j].d == 2)
            {
                //是否到达上边界:
                if(arr[j].x == 0) //我就按照正常的笛卡尔坐标来!之前那个贪吃蛇有点不同
                {
                    //修改arr[j].d即可
                    arr[j].d = 3;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    }
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }
                }
                else{
                    //向左移动1格:
                    arr[j].x -=1;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    } 
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }

                }
            }


            //右:
            else if(arr[j].d == 3)
            {
                //是否到达上边界:
                if(arr[j].x == n-1) //我就按照正常的笛卡尔坐标来!之前那个贪吃蛇有点不同
                {
                    //修改arr[j].d即可
                    arr[j].d = 2;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    }
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }
                }
                else{
                    //向右移动1格:
                    arr[j].x +=1;
                    //--判断board同一个位置是否需要战斗
                    if(board[arr[j].x][arr[j].y] != 0 )
                    {
                        //战斗:
                        int index = board[arr[j].x][arr[j].y];
                        if(arr[j].f > arr[index].f)
                        {
                            // j留下
                            board[arr[j].x][arr[j].y] = j;
                            flag[index] = 1;
                        }
                        else{
                            // index留下
                            flag[j] = 1;//阵亡
                        }
                    } 
                    else{
                        //在board上面占一个坑位,等其他人过来
                        board[arr[j].x][arr[j].y] = j;
                    }

                }
            }

        }
    }
    
    //输出k行,也就是最后的k根cong的位置
    for(int i =1 ;i<=k ;i++)
    {
        cout<<arr[i].x<<" "<<arr[i].y<<endl;
    }

    return 0;
}
 T3:路径个数

有n个点,每个点有一个权值,每两点间的不同边的个数为他们权值相与得到的值的二进制数字中的1的个数(边为有向边,有第i指向第j,i小于j)求第1个点到第n个点的路径个数(当且仅当不止一条边不同才被称为两条不同的路径),由于数据很大,对991247取模。

输入:第1行n,第二行分别试每个点权值 输出:路径个数 数据范围:n在2e5内,权值大小在1e9内

解:

(1)补充:<bitset>库中的使用示例:

#include <iostream>
#include <bitset>

int main() {
    // 定义一个包含8位的bitset,初始化所有位为0
    std::bitset<8> bitset1;
    
    // 通过下标赋值
    bitset1[0] = 1; // 设置第一位为1
    bitset1[3] = 1; // 设置第四位为1
    
    // 输出bitset
    std::cout << "Bitset1: " << bitset1 << std::endl; // 输出可能是 "00010010"
    
    // 通过整数初始化
    std::bitset<8> bitset2(7); // 二进制表示为 00000111
    
    std::cout << "Bitset2: " << bitset2 << std::endl; // 输出 "00000111"
    
    // 通过字符串初始化
    std::bitset<8> bitset3("10101010");
    
    std::cout << "Bitset3: " << bitset3 << std::endl; // 输出 "10101010"
    
    // 访问和修改
    std::cout << "Third bit of bitset3: " << bitset3.test(2) << std::endl; // 输出1,因为第三位是1
    bitset3.flip(2); // 翻转第三位
    std::cout << "After flipping third bit: " << bitset3 << std::endl; // 输出可能是 "10101000"
    
    // 操作
    std::bitset<8> bitset4("11110000");
    std::cout << "Bitset4 & bitset2: " << (bitset4 & bitset2) << std::endl; // 位与操作
    std::cout << "Bitset4 | bitset2: " << (bitset4 | bitset2) << std::endl; // 位或操作
    std::cout << "Bitset4 ^ bitset2: " << (bitset4 ^ bitset2) << std::endl; // 位异或操作
    
    return 0;
}

(2)更正参考解法:

//路径:
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

//不要想那么多,置之死地而后生,对得起自己的money和精力即可,结果不要管他
//成为一个正在的编程算法强者,用思考力证明自己,这东西到哪都很有用!
//这一题很有意思,关键当然是 如何计算 “权值 与运算 后,二进制1的个数”
vector<int> power;
int n;

void init()
{
    cin>>n;
    for(int i = 0;i<n ;i++)
    {
        int tmp;
        cin>>tmp;
        power.push_back(tmp);
    }
}

//写一个函数:输入2个整数, 输出 计算出1的个数:
//注意:调用bitset库 和 不调用库实现:
int count1(int a,int b)
{
    int ans = 0 ;
    int tmp = a&b;
    while(tmp>0)
    {
        if(tmp&1 !=0)  // 或者 tmp%2 == 1
        {
            ans++;
        }
        tmp = tmp>>1;
    }
    return ans;

}

//第二个关键点:让我想起了 罗文寒 的那个 5=1+1+1+1+1的个数那个,递归思想

//这一题我不太能接受,我给一个测试用例吧,如果对了还好,不对就自己再想一个:
//果然,就是有问题 —— 估计是题目给错了,不过,那我不如将错就错的写一写
int calc(int n )
{
    if(n == 1)
    {
        return 2;
    }
    else{
        return 2+calc(n-1)*2;
    }
}

//我的解法的测试用例:其中i与j之间都是2条路:
int calc2(int i , int j)
{
    if( i == j )
    {
        return 1;
    }
    else{
        int ans = 0;
        for(int k = i+1; k<=j ;k++)
        {
            ans =(ans + 2*calc2(k,j))%991127;
        }
        return ans;

    }
}

//下面这个是作为 该题答案
int mycalc(int i , int j)
{
    //i是小的那个起点 , j是大的那个终点:
    //递归出口:
    if( i == j)
    {
        return 1;
    }
    else
    {
        int ans = 0;
        for(int k = i+1; k<=j ;k++)
        {
            ans =(ans + count1(power[i],power[k])*mycalc(power[k],power[j]))%991127;
        }
        return ans;
    }

}


int main()
{
    cout<<calc(3)<<endl;       //输出14 -不对
    cout<<calc2(0,3)<<endl;    //输出18 -这才对

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(常见的排序算法)

1.插入排序 1.1直接插入排序 在[0 end]区间上有序&#xff0c;然后将&#xff08;end1&#xff09;的数据与前面有序的数据进行比较&#xff0c;将&#xff08;end1&#xff09;的数据插入&#xff0c;这样[0 end1]区间上就是有序的&#xff0c;然后再向后进行比较。 例如&a…

验证码识别接口、多种样式验证码识别接口、中英文验证码识别接口

验证码识别接口、多种样式验证码识别接口、中英文验证码识别接口 本文提供一个基于OCR和机器学习的验证码识别接口&#xff0c;能够识别较复杂的中文、英文验证码&#xff0c;在OCR的基础上针对验证码进行算法优化。本接口是收费的&#xff08;最低0.5分1次调用&#xff0c;试…

单片机(STM32)与上位机传输浮点数

目录 单片机(STM32)与上位机传输数据的方法1. 传输整形数据2. 传输浮点数据3. 如何打包与解包 单片机(STM32)与上位机传输数据的方法 在进行单片机程序的开发时&#xff0c;常常需要与其他设备进行通信。一种情况是与其他电路板通信&#xff0c;比如STM32主机与STM32从机通信&…

CentOS7 MySQL5.7.35主从 不停机搭建 以及配置

如需安装MySQL&#xff0c;参照MySQL 5.7.35 安装教程 https://blog.csdn.net/CsethCRM/article/details/119418841一、主&从 环境信息准备 1.1.查看硬盘信息&#xff0c;确保磁盘够用&#xff08;主&从&#xff09; df -h1.2.查看内存信息 &#xff08;主&从&am…

基尼系数计算过程

引言 在探讨经济公平性时&#xff0c;基尼系数是一个不可忽视的指标。它不仅反映了一个国家或地区内部的收入分配状况&#xff0c;还对政策制定和社会稳定有着深远的影响。 基尼系数的定义 基尼系数是由意大利统计学家科拉多基尼在1912年提出的&#xff0c;用来衡量一个国家…

【T3】畅捷通T3软件查询明细账等账簿,出现某些列串位置。

【问题描述】 查询畅捷通T3软件科目明细账的时候&#xff0c; 出现某些行的数据串位置&#xff0c; 摘要、金额、方向都没有在对应的列。 【解决方案】 根据跟踪发现&#xff0c;最终在客户档案上发现问题。 数据串位中对应的客户名称、简称中的对后面多了一个【tab】键的空格…

Nodejs 第七十七章(MQ高级)

MQ介绍和基本使用在75章介绍过了&#xff0c;不再重复 MQ高级用法-延时消息 什么是延时消息? Producer 将消息发送到 MQ 服务端&#xff0c;但并不期望这条消息立马投递&#xff0c;而是延迟一定时间后才投递到 Consumer 进行消费&#xff0c;该消息即延时消息 插件安装 R…

【深度学习】NLP,Transformer讲解,代码实战

文章目录 1. 前言2. Transformer结构训练过程1. 输入嵌入和位置编码2. 编码器层2.1 单头的注意力机制(便于理解)2.2 多头的注意力机制(Transformer真实使用的)2.3 残差连接和层归一化2.4 前馈神经网络&#xff08;FFN&#xff09;2.5 残差连接和层归一化2.6 总结 3. 解码器层 推…

Jenkins构建 Maven项目(微服务)并自动发布

前面讲了docker 安装Jenkins和gitlab代码管理工具&#xff0c;接下来我们讲一下Jenkins怎么构建 Maven项目。 1. 首先Jenkins配置下面3中工具类 首先是在本地安装三个jenkins自动配置相关的工具 1.1 JDK 由于我们使用docker来启动jenkins&#xff0c;其自带有jdk&#xff0c;…

摩托罗拉手机在中国以外的市场复兴,在欧洲和美国大幅增长

摩托罗拉曾是全球手机行业的领导者&#xff0c;不过自从被诺基亚击败后&#xff0c;它就辗转被卖了又卖&#xff0c;曾经辉煌的品牌堕落了&#xff0c;让人颇为可惜&#xff0c;不过如今摩托罗拉手机似乎看到了复兴的希望&#xff0c;在中国以外的市场都取得了快速增长。 市调机…

BC11 学生基本信息输入输出

BC11 学生基本信息输入输出 废话不多说上题目&#xff1a; 这道题表面上很简单&#xff0c;但是里面有很重要的点先给大家上正确的代码&#xff1a; #include<stdio.h> int main() {int stu 0;float c 0;float English 0;float math 0;scanf("%d;%f,%f,%f"…

Unity API学习之消息机制理论与应用

目录 消息机制 示例1&#xff1a;同一物体中不同组件之间发送消息 示例2&#xff1a;父与子对象之间的消息发送(BroadcastMassage) 父对象向子对象发送消息 ​编辑 子对象向父对象发送消息 消息机制 在Unity中&#xff0c;SendMessage 方法用于在游戏对象及其所有子对象上…

Zabbix6.0自动发现Linux服务器并添加主机

文章目录 一、整体流程二、操作过程 一、整体流程 Zabbix自动发现主机功能是Zabbix监控系统的一个重要功能&#xff0c;它能够自动发现并添加新的主机到监控系统中&#xff0c;从而减少人为繁琐的操作&#xff01; 步骤操作1️⃣ 第一步创建自动发现规则2️⃣ ​第二步创建自…

汇编语言作业(五)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、 实验总结 一、实验目的 1.熟悉掌握汇编语言的程序结构&#xff0c;能正确书写数据段、代码段等 2&#xff0c;利用debug功能&#xff0c;查看寄存器&#xff08;CS,IP,AX,DS..)及数据段的…

Python集合的基本概念和使用方法

目录 集合&#xff08;Set&#xff09; 基本概念 基本特性 基本操作 集合运算 成员测试 高级操作 集合推导式 总结 集合&#xff08;Set&#xff09; Python集合&#xff08;Set&#xff09;是Python语言中一个非常实用且强大的数据结构&#xff0c;它用于存储多个不…

Python实现删除Word文档中带有“指定内容”的段落文本(7)

前言 本文是该专栏的第7篇,后面会持续分享Python办公自动化干货知识,记得关注。 在处理word文档内容的时候,有时候我们需要一个干净整洁的文本内容。比如说,如下图所示的情况: 在处理上述word文档内容的时候,我们希望将文本底部的“下载链接”以及“附件信息”两个段落,…

力扣199. 二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: [] /*** Def…

二叉树顺序结构——堆的结构与实现

二叉树顺序结构——堆的结构与实现 一、二叉树的顺序结构二、堆的概念及结构三、堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入(堆向上调整算法)堆的删除堆的代码实现(使用VS2022的C语言)初始化、销毁构建、插入、删除返回堆顶元素、判空、返回有效元素个数 四、完整 …

【Python教程】4-字符串、列表、字典、元组与集合操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

7.高级纹理

前面的基础纹理包括法线纹理、渐变纹理和遮罩纹理等。这些纹理都属于低纬&#xff08;一维或二维&#xff09;纹理。 立方体纹理&#xff08;Cubemap&#xff09;实现环境映射 渲染纹理&#xff08;Render Texture&#xff09; 程序纹理&#xff08;Procedure Texture&#…