18.3.7给小可爱们的(NBUOJ)

本文介绍了几种典型的一维数组操作方法,包括数组逆序显示、有序数组查找、数组插入及评委打分处理策略。通过具体实例展示了不同场景下的最优算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1155 一维数组逆序显示

  • 思路1:先倒序(回文类似),再输出
  • 思路2:直接反着输出
  • 思路2代码:
    int digit[15];//一般都多开几个,比如要求1e5个,那我会开1e5+10个
    int i;
    for(i=0;i<10;i++){
        scanf("%d",&digit[i]);
    }

    printf("%d",digit[9]);
    for(i=8;i>=0;i--){
        printf(" %d",digit[i]);
    }
    printf("\n");

1158 有序数组的查找

  • 思路:条件:10个数;升序;∴easy
  • 代码:
    int digit[15];
    int i,key;
    for(i=0;i<10;i++){
        scanf("%d",&digit[i]);
    }
    scanf("%d",&key);

    int flag=1;
    for(i=0;i<10;i++){
        if(digit[i] == key){
            printf("%d\n",i);
            flag=0;
            break;
        }
    }

    if(flag){
        printf("not found\n");
}

1153 一维数组的插入

  • 思路1:将数据插入到原数组之后再排序
  • 思路2:条件:1.原数组升序;2.只插入一个数key3.数据量非常小。结论:我们可以懒省事儿一下,只输出,不排序,但是要考虑边界。
  • 思路3:从后往前边找边挪,找到后插入,最后输出

  • 思路1代码:太简单了,略吧。
  • 思路2代码:
int digit[15];
    int i,key;
    //输入
    for(i=0;i<10;i++){
        scanf("%d",&digit[i]);
    }
    scanf("%d",&key);

    if(key<digit[0])//边界
        printf("%d ",key);
    printf("%d ",digit[0]);

    for(i=1;i<10;i++){
        if(key > digit[i-1] && key < digit[i]){
            printf("%d ",key);
        }
        printf("%d ",digit[i]);
    }

    if(key > digit[9]){//边界
        printf("%d ",key);
    }
printf("\n");

  •  思路3代码:
	int digit[15];
	int i,key;
//输入
	for(i=0;i<10;i++){
        scanf("%d",&digit[i]);
	}
	scanf("%d",&key);
//处理
	for(i=9;digit[i]>key;i--){
        digit[i+1]=digit[i];
	}
    digit[i+1]=key;
//输出
	for(i=0;i<11;i++){
        printf("%d ",digit[i]);
	}
    printf("\n");

1147 简单评委打分

  • 思路1:因为数据个数确定且非常小,所以可以先排序,再去首去尾计算均值
  • 思路2:计算和,找出最大值和最小值,用和减去最大最小值再除以6
 
  • 思路1代码:
    double score[10];
    int i;
    //输入
    for(i=0;i<8;i++){
        scanf("%lf",&score[i]);
    }

int j;
//简单排序
    for(i=0;i<7;i++){
        for(j=i;j<8;j++){
            if(score[i]<score[j]){  //swap(score[i],score[j]);
                double temp=score[i];
                score[i]=score[j];
                score[j]=temp;
            }
        }
    }

double ave=0;//均值
    for(i=1;i<7;i++){
        ave+=score[i];
    }
    ave/=6;
    printf("%.2f\n",ave);

  • 思路2代码:
double score[10];
    int i;
    for(i=0;i<8;i++){
        scanf("%lf",&score[i]);
    }

    double sum,maxsc,minsc;//和、最大最小值

    sum=0;
    maxsc=score[0];
    minsc=score[0];
    
    for(i=0;i<8;i++){
        sum+=score[i];
        if(maxsc<score[i])
            maxsc=score[i];
        if(minsc>score[i])
            minsc=score[i];
    }

    sum-=maxsc+minsc;
    double ave=sum/6;
    printf("%.2f\n",ave);

  • 思路2精简版:
//输入
for(i=0;i<8;i++){//边输入边计算
    scanf("%lf",&score[i]);
    sum+=score[i];
    if(i==0 || maxsc<score[i])
        maxsc=score[i];
    if(i==0 || minsc>score[i])
        minsc=score[i];
}

sum-=maxsc+minsc;
double ave=sum/6;

1252 一位数出现的次数

  • 思路:用数组存储,输出时判断一下即可
  •  代码:
    int d;
    int num[15]={0};//还有一种清零的方法是memset,有兴趣的自行上网搜
    while(scanf("%d",&d)!=EOF){
        if(d<10)
            num[d]++;
    }

    int i;
    for(i=0;i<10;i++){
        if(num[i]!=0){
            printf("%d:%d\n",i,num[i]);
        }
}

总结:

列举一下一些小朋友的错误或者问题:

   1. for循环里面的i的范围要搞清楚。for(i=0;i<10;i++)可以用,for(i=1;i<=10;i++)也可以用,但是对于不同的情况可以选取合适的i减少代码量。有的人想表达相同的意思却写成for(i=0;i<=10;i++)那就不对了。有时候我们还会写for(i=10;i>0;i--),这时候i变成--,粗心的小朋友可能也会出错。
   2. 当你发现出现一个如下图所示的对话框,这一般代表着你的指针出问题了,以你们目前的阶段,可以检查一下自己有没有漏写scanf里面的&。等你们学了指针,会对此有更多理解。有的小朋友要是容易写出bug并且不能吃一堑长一智,不妨做一个bug笔记本,每次出错找不到的时候可以对着曾经出错点来找。

   3. 发现有的小朋友看到英语就怯场啊,但其实也就那些单词,很多书即使有单词不认识也不影响阅读。你们学机械,以后还要看很多英文文献和书籍,害怕看英文肯定不行的啦。起码CB告诉你的error应该看懂的~课上看到一只小朋友的errorarray subscript is not an integer。像这个提示呢,subscript(下标)不知道可以理解,但是array(数组)还是得知道的。再举几个简单例子,灰色跟白色的这种看不懂就要去查单词咯~还有呢,很多小朋友不知道Presentation Error 是什么意思,这是格式错误,常见的错误还有好几种,你们遇到了都可以去查一下,帮助你们修改代码哦~



       4.另外就是发现好些小朋友debug能力都比较弱,有兴趣的可以上优快云上查一下如何用CB做debug,学姐可以用亲身经验告诉你们,写代码找不到bug是件很痛苦很痛苦的事情。。。如果实在玩不转CB的debug,那最好你写代码之前思路要够清晰;逻辑或者说算法没有问题;会用输出中间变量的方法检查错误。这样可能也差不多够用了。

 

 










<think>我们正在为ARM64架构的Debian 11系统编译Mesa 18.3.6。以下是步骤: 1. **安装依赖项**:首先需要安装必要的构建工具和库。 2. **获取源代码**:下载Mesa 18.3.6的源代码。 3. **配置编译选项**:针对ARM64进行配置。 4. **编译和安装**:使用make进行编译并安装。 注意:Mesa 18.3.6是一个较旧的版本,可能在新系统上编译时遇到依赖问题,需要调整。 ### 详细步骤 #### 1. 安装依赖项 在Debian 11上安装编译Mesa所需的依赖包。打开终端并执行: ```bash sudo apt update sudo apt install -y build-essential git ca-certificates \ python3-mako python3-pip python3-setuptools \ bison flex libdrm-dev libexpat1-dev libwayland-dev \ libwayland-egl-backend-dev libx11-dev libx11-xcb-dev \ libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev \ libxcb-present-dev libxcb-randr0-dev libxcb-shm0-dev \ libxcb-sync-dev libxcb-xfixes0-dev libxdamage-dev \ libxext-dev libxfixes-dev libxrandr-dev libxshmfence-dev \ libxxf86vm-dev pkg-config zlib1g-dev \ libvulkan-dev libzstd-dev ``` 注意:由于Mesa 18.3.6较旧,可能需要一些较旧版本的库。如果遇到问题,可能需要尝试安装旧版本库或调整配置。 #### 2. 获取源代码 下载Mesa 18.3.6的源代码。可以通过git克隆并切换到18.3.6标签: ```bash git clone https://gitlab.freedesktop.org/mesa/mesa.git cd mesa git checkout mesa-18.3.6 ``` 或者直接下载压缩包: ```bash wget https://archive.mesa3d.org//mesa-18.3.6.tar.xz tar xvf mesa-18.3.6.tar.xz cd mesa-18.3.6 ``` #### 3. 配置编译选项 创建一个构建目录并进入: ```bash mkdir build cd build ``` 然后运行配置脚本。针对ARM64架构,我们可以使用如下配置: ```bash meson setup .. \ -Dprefix=/usr/local \ -Ddri-drivers= \ -Dgallium-drivers=swrast,virgl,vc4,v3d \ -Dvulkan-drivers= \ -Dplatforms=x11,wayland \ -Ddri3=true \ -Dglx=dri \ -Dgles1=false \ -Dgles2=true \ -Degl=true \ -Dgbm=true \ -Dshared-glapi=true \ -Dllvm=false ``` 注意:这里我们禁用了LLVM(因为ARM64上可能不需要或者需要额外配置),并选择了一些适合ARM的Gallium驱动(如vc4, v3d)。具体驱动选择取决于你的硬件。如果你不确定,可以只使用`swrast`(软件渲染)或根据你的GPU选择。 另外,Mesa 18.3.6可能使用autotools而不是meson。在18.3.6版本中,meson已经可用,但如果你遇到问题,可以尝试使用autotools: ```bash ../configure \ --prefix=/usr/local \ --disable-dri \ --disable-dri3 \ --disable-egl \ --disable-gbm \ --disable-gles1 \ --enable-gles2 \ --enable-osmesa \ --with-gallium-drivers=swrast,virgl,vc4,v3d ``` 但是,请注意,18.3.6版本中,autotools可能已被弃用,因此推荐使用meson。如果meson版本太新,可能不支持旧配置,这时可以尝试安装旧版meson(0.53.0或更早)或者使用autotools。 #### 4. 编译和安装 使用ninja编译(如果使用meson): ```bash ninja sudo ninja install ``` 如果使用autotools: ```bash make -j$(nproc) sudo make install ``` 编译完成后,可能需要更新动态链接库缓存: ```bash sudo ldconfig ``` ### 注意事项 - 由于Debian 11的库较新,而Mesa 18.3.6较旧,可能会遇到一些编译错误,需要根据错误信息调整。 - 如果遇到依赖问题,可能需要安装旧版本的库,或者从源代码编译这些依赖项。 - 如果使用meson构建,确保meson版本不低于0.47.0(这是Mesa 18.3.6所需的最低版本),但也不要太高以避免兼容问题。Debian 11的默认meson版本可能合适(可以通过`meson --version`查看)。 ### 常见问题解决 - **错误:找不到某些头文件或库**:尝试安装对应的`-dev`包。 - **meson配置失败**:检查错误日志,可能需要调整配置选项。 - **编译错误**:可能是由于新旧库不兼容,需要修改代码或使用补丁。 如果遇到具体错误,可以搜索错误信息或查看Mesa的邮件列表和论坛。 §§相关问题§§ 1. 如何为ARM64架构交叉编译Mesa? 2. 在Debian 11上编译旧版Mesa时遇到依赖问题怎么办? 3. Mesa的Gallium驱动是什么?如何选择适合ARM64的驱动?</think>### 在Debian 11上为ARM64编译Mesa 18.3.6的完整指南 #### **1. 安装编译依赖** ```bash sudo apt update sudo apt install -y \ build-essential meson ninja-build pkg-config \ python3-mako python3-pip python3-setuptools \ libdrm-dev libx11-dev libxext-dev libxfixes-dev \ libxcb-dev libx11-xcb-dev libxcb-dri2-0-dev \ libxcb-dri3-dev libxcb-present-dev libxcb-randr0-dev \ libxcb-sync-dev libxshmfence-dev libxxf86vm-dev \ libvulkan-dev zlib1g-dev libexpat1-dev \ libwayland-dev wayland-protocols \ flex bison libssl-dev ``` > 📌 注意:Mesa 18.3.6需要较旧工具链,需额外安装: ```bash sudo apt install -y \ libdrm2=2.4.104-1 \ libdrm-dev=2.4.104-1 \ libwayland-client0=1.18.0-2 \ libwayland-dev=1.18.0-2 ``` #### **2. 获取源代码** ```bash wget https://archive.mesa3d.org/mesa-18.3.6.tar.xz tar xvf mesa-18.3.6.tar.xz cd mesa-18.3.6 ``` #### **3. 配置ARM64编译选项** ```bash mkdir build && cd build meson setup .. \ --prefix=/usr/local \ -Dplatforms=x11,wayland \ -Ddri-drivers= \ -Dgallium-drivers=swrast,virgl,vc4,v3d \ -Dvulkan-drivers= \ -Ddri3=enabled \ -Dglx=dri \ -Dgles1=disabled \ -Dgles2=enabled \ -Degl=enabled \ -Dgbm=enabled \ -Dshared-glapi=enabled \ -Dllvm=disabled ``` > 🔍 关键参数说明: >- `-Dgallium-drivers=vc4,v3d`:针对ARM64的Broadcom VideoCore GPU >- `-Dllvm=disabled`:避免LLVM兼容性问题 >- `-Ddri-drivers=`:禁用不兼容的DRI驱动 #### **4. 编译与安装** ```bash ninja -j$(nproc) sudo ninja install ``` #### **5. 验证安装** ```bash /usr/local/bin/glxinfo | grep "OpenGL version" # 应输出: OpenGL version string: 3.3 (Compatibility Profile) Mesa 18.3.6 ``` #### **6. 环境配置** 更新动态链接库缓存: ```bash sudo ldconfig ``` 设置环境变量(添加到 `~/.bashrc`): ```bash export LIBGL_DRIVERS_PATH=/usr/local/lib/dri export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ``` ### 常见问题解决 1. **依赖冲突**: ```bash sudo apt install -t buster-backports libdrm-dev=2.4.104-1 ``` 2. **Wayland协议不兼容**: ```bash git clone https://gitlab.freedesktop.org/wayland/wayland-protocols cd wayland-protocols && git checkout 1.18 meson build && sudo ninja -C build install ``` 3. **编译错误`&#39;DRM_FORMAT_MOD_INVALID&#39;`**: 编辑 `include/drm/drm_fourcc.h`,添加: ```c #define DRM_FORMAT_MOD_INVALID 0 ``` ### 性能优化建议 - 启用ARM64 NEON加速:在meson配置中添加 `-Dc_args="-mcpu=native"` - 使用LTO优化:添加 `-Db_lto=true` > ⚠️ 重要提示: > Mesa 18.3.6对现代ARM Mali GPU支持有限,建议新硬件使用Mesa 22+版本[^1]。若需硬件加速,需安装闭源驱动(如树莓派需`sudo apt install libraspberrypi-dev`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值