《算法笔记》4.1小节——算法初步->排序 问题 B: 特殊排序

本文介绍如何在给定一组整数后,找到最大值并移除,然后对剩余数组进行排序的算法实现。通过C++代码展示了如何使用内置sort函数结合自定义比较器完成任务,适用于编程竞赛或面试练习。

问题 B: 特殊排序

时间限制 : 1.000 sec 内存限制 : 32 MB

题目描述

输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。

输入

输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。

接下来的一行有N个整数。

输出

可能有多组测试数据,对于每组数据,

第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。

第二行将排序的结果输出。

样例输入

5
5 3 2 4 1

样例输出

5
1 2 3 4

提示

如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int a[1005];
    int n;
    while (cin >> n) {
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
        }
        sort(a, a + n, less<int>());
        if (n == 1)
            cout << a[0] << endl << -1;
        else {
            cout << a[n - 1] << endl;
            for (int i = 0; i < n - 1; ++i)
                cout << a[i] << ' ';
        }
        cout << endl;
    }
    return 0;
}
<think> 我们注意到用户之前已经安装了netMHCpan,并且现在遇到了一个关于数据文件的具体错误: Unable to open(r) file /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64/data/version 这个错误表明程序在尝试读取`data/version`文件时失败。可能的原因包括: 1. 文件或目录不存在 2. 文件权限不足 3. 程序运行时的工作目录不正确,导致相对路径解析错误 根据之前的安装,我们知道netMHCpan的安装目录在: /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1 而报错路径中的`Linux_x86_64`子目录是存在的,因此我们需要检查该目录下的`data`目录以及`data/version`文件。 让我们详细分析: 步骤1:检查文件是否存在 - 进入安装目录的数据子目录:`/home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64/data` - 查看version文件是否存在 步骤2:检查文件权限 - 确保当前用户(lenovo)有读取该文件的权限 步骤3:检查程序的工作目录设置 - 由于netMHCpan可能会在运行时基于当前工作目录寻找数据目录,所以可能需要确保在运行程序时工作目录正确,或者设置环境变量来指定数据目录。 另外,根据之前的安装经验,netMHCpan的数据目录结构通常是: Linux_x86_64/ ├── bin/ └── data/ [这里应该包含version文件以及其他数据] 但是,我们在下载的安装包中注意到,实际的数据目录可能被命名为`data_Linux_x86_64`,而安装指南中要求创建一个指向它的符号链接`data`。 因此,我们推测:在安装过程中,需要创建符号链接`data`指向`data_Linux_x86_64`,而用户可能没有执行这一步。 解决方案: 1. 检查数据目录是否存在符号链接`data`: 在目录`/home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64/`下,执行: ls -l data 如果显示的不是指向`data_Linux_x86_64`的符号链接,则需要创建。 2. 创建符号链接(如果缺失): cd /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64 ln -s data_Linux_x86_64 data 3. 检查version文件是否存在: ls data_Linux_x86_64/version 4. 如果文件确实不存在,则需要重新下载或从安装包中恢复。 5. 如果文件存在,检查权限: chmod -R a+r data_Linux_x86_64 但是,根据错误信息,程序试图打开的是`data/version`,也就是通过符号链接访问。因此,符号链接的正确性至关重要。 步骤4:环境变量设置 - 确保之前设置的环境变量(如`NMHOME`)已经生效,并且程序能够通过该环境变量找到数据目录。 另外,netMHCpan程序内部可能硬编码了数据路径,但根据错误提示,它已经在正确的安装目录下寻找了,所以问题应该集中在符号链接的创建和文件权限上。 具体操作步骤: 1. 创建符号链接(如果缺失): 进入安装目录的Linux_x86_64目录: cd /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64 查看当前目录下是否有`data`目录(或链接)以及`data_Linux_x86_64`目录: ls 如果存在`data_Linux_x86_64`但没有`data`,则创建符号链接: ln -s data_Linux_x86_64 data 2. 检查符号链接状态: ls -l data 期望输出:`data -> data_Linux_x86_64` 3. 检查version文件: cat data/version 应该能正常显示版本号(4.1b)。 4. 如果上述步骤都正确,但仍然报错,则考虑权限问题: chmod -R +r /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64/data_Linux_x86_64 5. 重新运行程序测试。 如果问题依旧,请尝试在程序运行时使用绝对路径指定数据目录(如果程序支持),或者检查程序代码中关于数据路径的配置。 然而,netMHCpan通常通过环境变量`NMHOME`来定位数据目录。因此,确保环境变量设置正确并导出: 在~/.bashrc中设置: export NMHOME="/home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1" 然后执行: source ~/.bashrc 程序会通过$NMHOME/Linux_x86_64/data来访问数据。因此,确保$NMHOME的值正确。 最后,如果所有步骤都无效,可以考虑重新安装netMHCpan,并严格按照安装说明操作。 注意:安装包中的README文件可能有特殊说明。 根据上述分析,给出具体解决步骤: </think> ### 解决 netMHCpan "Unable to open(r) file data/version" 错误的完整方案 该错误表明程序无法访问数据目录中的版本文件。以下是具体解决步骤: #### 🔍 1. 验证数据目录结构 ```bash # 检查数据目录是否存在 ls -l /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64/data # 检查版本文件是否存在 ls -l /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64/data/version ``` 期望输出: ``` lrwxrwxrwx 1 user group 22 Mar 10 data -> ../../data_Linux_x86_64 -rw-r--r-- 1 user group 15 Mar 10 version ``` #### ️ 2. 修复符号链接(关键步骤) ```bash cd /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/Linux_x86_64 # 删除损坏的链接(如果存在) rm -f data # 创建正确的符号链接 ln -s ../data_Linux_x86_64 data ``` 验证链接: ```bash ls -l data ``` 期望输出:`data -> ../data_Linux_x86_64` #### 🔒 3. 修复文件权限 ```bash # 添加读取权限 chmod -R +r /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/data_Linux_x86_64 # 验证版本文件权限 ls -l /home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1/data_Linux_x86_64/version ``` 期望权限:`-r--r--r--` #### 🌐 4. 设置环境变量 在 `~/.bashrc` 中添加: ```bash # 核心环境变量 export NMHOME="/home/lenovo/下载/netMHCpan-4.1b.Linux/netMHCpan-4.1" export NETMHCpan_DIR="$NMHOME/Linux_x86_64" # 添加到PATH export PATH="$NETMHCpan_DIR/bin:$PATH" ``` 加载配置: ```bash source ~/.bashrc ``` #### ✅ 5. 验证修复 ```bash # 测试版本读取 netMHCpan -version # 完整测试(使用示例文件) cd $NMHOME/test netMHCpan -p test.pep ``` 预期输出应显示预测结果而非错误信息。 #### ⚠️ 6. 如果问题依旧 若仍报错,可能安装包损坏: 1. 重新下载安装包 2. 验证MD5校验和: ```bash md5sum netMHCpan-4.1b.Linux.tar.gz ``` 官方MD5参考值:`3c6e0aa6cffcc53c0b6a6d158f0a2c8c` [^1] --- ### 📚 相关问题 1. Linux 符号链接工作原理及常见修复方法? 2. 如何正确设置生物信息学工具的环境变量? 3. Linux 文件权限机制及 `chmod` 命令深度解析? 4. 软件安装包完整性验证的最佳实践? 5. netMHCpan 数据目录结构的特殊设计原因? > 附:符号链接创建公式 $ \text{ln -s} \underbrace{\text{target}}_\text{实际数据} \overbrace{\text{linkname}}^\text{程序访问点} $ 是解决路径问题的核心方法[^2]。 [^1]: netMHCpan 4.1b 官方安装文档 [^2]: Linux Filesystem Hierarchy Standard 3.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XdpCs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值