http://pat.zju.edu.cn/contests/pat-practise/1038

本文介绍了一个算法挑战,即从给定的数字段集合中找出能够组成最小数字的组合方式。通过对数字段进行特定的排序和组合,确保生成的数字是最小的。文章提供了一个C++实现示例,通过字符串拼接的方式比较大小,并最终输出结果。

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

1038. Recover the Smallest Number (30)
时间限制
400 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given {32, 321, 3214, 0229, 87}, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders of combinations of these segments, and the smallest number is 0229-321-3214-32-87.

Input Specification:

Each input file contains one test case. Each case gives a positive integer N (<=10000) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the smallest number in one line. Do not output leading zeros.

Sample Input:
5 32 321 3214 0229 87
Sample Output:
22932132143287

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string>  
  3. #include <algorithm>  
  4. #include <memory.h>  
  5. #include <cstdio>  
  6. #include <cstdlib>  
  7. #include <vector>  
  8. using namespace std;  
  9. #define MAX 0Xfffffff  
  10. string a[10001];  
  11.   
  12. bool cmp(string s1, string s2){  
  13.       
  14.     return s1+s2<s2+s1;  
  15. }  
  16. int main(){  
  17.   
  18.     //freopen("in.txt", "r", stdin);  
  19.   
  20.     int n;  
  21.     cin>>n;  
  22.     for(int i=0;i<n;++i){  
  23.         cin>>a[i];  
  24.     }  
  25.     sort(a, a+n, cmp);  
  26.     bool first = true;  
  27.     bool print = false;  
  28.     for(int i=0;i<n;++i){  
  29.         int len = a[i].length();  
  30.         for(int j=0;j<len;++j){  
  31.             if(first){  
  32.                 if(a[i][j]!='0'){  
  33.                     printf("%c", a[i][j]);  
  34.                     print = true;  
  35.                     first = false;  
  36.                 }         
  37.             }else{  
  38.                 printf("%c", a[i][j]);  
  39.                 print = true;  
  40.             }  
  41.         }  
  42.     }  
  43.     if(!print)  
  44.         printf("0");  
  45.     printf("\n");  
  46.     //fclose(stdin);  
  47. }     
──(root㉿xcs)-[/home/xcs/桌面] └─# gpg --show-keys /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg gpg: 目录‘/root/.gnupg’已创建 gpg: 钥匙箱‘/root/.gnupg/pubring.kbx’已创建 pub rsa4096 2025-04-17 [SC] [有效至:2028-04-17] 827C8569F2518CC677FECA1AED65462EC8D5E4C5 uid Kali Linux Archive Automatic Signing Key (2025) <devel@kali.org> ┌──(root㉿xcs)-[/home/xcs/桌面] └─# apt update 错误:1 http://mirrors.aliyun.com/kali kali-rolling InRelease 403 Forbidden [IP: 124.225.96.42 80] 命中:2 http://http.kali.org/kali kali-rolling InRelease 获取:3 http://http.kali.org/kali kali-rolling/main i386 Packages [20.4 MB] 获取:4 http://http.kali.org/kali kali-rolling/main i386 Contents (deb) [47.7 MB] 获取:5 http://http.kali.org/kali kali-rolling/contrib i386 Packages [97.1 kB] 获取:6 http://http.kali.org/kali kali-rolling/contrib i386 Contents (deb) [183 kB] 获取:7 http://http.kali.org/kali kali-rolling/non-free i386 Packages [147 kB] 获取:8 http://mirrors.neusoft.edu.cn/kali kali-rolling/non-free i386 Contents (deb) [859 kB] 错误: 无法下载 http://mirrors.aliyun.com/kali/dists/kali-rolling/InRelease 403 Forbidden [IP: 124.225.96.42 80] 错误: 仓库 “http://mirrors.aliyun.com/kali kali-rolling InRelease” 没有数字签名。 注意: 无法安全地用该源进行更新,所以默认禁用该源。 注意: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。 ┌──(root㉿xcs)-[/home/xcs/桌面] └─#
最新发布
07-28
<think>我们有两个主要问题: 1. `apt-key: command not found` 这是因为在较新的Debian/Ubuntu/Kali系统中,`apt-key`命令已被弃用,我们需要使用新的方法管理密钥。 2. 软件源签名验证失败,例如:`The repository 'http://mirrors.aliyun.com/kali kali-rolling InRelease' is not signed` 或者 `NO_PUBKEY ED444FF07D8D0BF6`,这通常是因为缺少对应的GPG密钥。 解决方案分为两部分: 第一部分:解决`apt-key`命令缺失问题并正确添加Kali Linux的GPG密钥。 第二部分:配置正确的软件源并确保密钥被信任。 根据引用[4]中的报错信息,我们知道Kali Linux的密钥ID是`ED444FF07D8D0BF6`。 步骤1:配置国内镜像源(以阿里云为例) 编辑`/etc/apt/sources.list`,替换为以下内容(引用[2]和[3]): deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib 步骤2:添加GPG密钥(使用新的方法) 由于`apt-key`已被弃用,我们使用以下方法: 方法一:使用gpg和trusted.gpg.d目录(推荐) ```bash # 下载密钥文件并转换为.gpg格式,存放在/etc/apt/trusted.gpg.d/目录下 curl -fsSL https://archive.kali.org/archive-key.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg ``` 方法二:如果系统支持,也可以使用以下命令(但可能不如方法一通用): ```bash # 使用wget下载密钥并导入到新位置 wget -q -O - https://archive.kali.org/archive-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/kali-archive-keyring.gpg ``` 步骤3:更新软件包列表 ```bash sudo apt update ``` 如果仍然遇到签名问题,可能是因为密钥没有正确导入或者软件源配置有误。请检查: 1. 确保软件源中的地址与镜像源地址一致(注意是http还是https,以及路径是否正确)。 2. 确保密钥文件被正确放置,并且权限正确(通常为644)。 如果遇到`NO_PUBKEY ED444FF07D8D0BF6`错误,可以尝试手动导入该密钥(使用旧方法,如果系统还支持): ```bash # 如果系统还有apt-key命令(不推荐,但有时临时解决) sudo apt install -y gnupg wget -q -O - https://archive.kali.org/archive-key.asc | sudo apt-key add - ``` 但是,请注意,在Debian 11及更高版本中,`apt-key`命令默认不安装,所以推荐使用新的方法。 另外,引用[1]中提到了同时存在新旧两个源(`mirrors.neusoft.edu.cn`和`old.kali.org`)的情况,这可能会导致冲突。建议只保留一个国内镜像源,避免混合使用。 因此,我们总结完整步骤: 1. 备份当前的源列表: ```bash sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak ``` 2. 编辑源列表,只保留一个国内镜像源(如阿里云): ```bash sudo vim /etc/apt/sources.list ``` 内容替换为: deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib 3. 下载并导入GPG密钥(使用新方法): ```bash sudo curl -fsSL https://archive.kali.org/archive-key.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg ``` 4. 更新软件包列表: ```bash sudo apt update ``` 5. 如果更新成功,则进行升级: ```bash sudo apt upgrade -y ``` 注意:如果使用其他镜像源(如清华大学、浙大),请确保URL正确。例如,清华大学镜像源(引用[3])的配置是: deb https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free 最后,如果遇到网络问题(如无法解析域名),请检查网络连接或尝试更换镜像源。 如果按照以上步骤操作后问题仍然存在,请检查系统时间是否正确(使用`date`命令),因为GPG签名验证对系统时间敏感。 生成的相关问题: 1. 如何为Kali Linux配置最佳国内镜像源? 2. Kali Linux更新时出现GPG签名错误如何解决? 3. Debian系Linux如何安全地管理软件仓库密钥?</think>### 解决 Kali Linux 中 `apt-key` 缺失和软件源签名问题 #### 问题分析 1. **`apt-key: command not found`** 在 Kali Linux 2023+ 版本中,`apt-key` 已被弃用,需使用新的密钥管理方式[^4]。 2. **软件源签名错误** 如 `The repository 'http://mirrors.aliyun.com/kali kali-rolling InRelease' is not signed` 表明系统未正确信任软件源签名密钥(Kali 官方密钥 ID: `ED444FF07D8D0BF6`)[^4]。 --- ### 完整解决方案 #### 步骤 1:配置国内镜像源(以阿里云为例) ```bash # 备份原配置 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 编辑源配置 sudo nano /etc/apt/sources.list ``` 删除所有内容,替换为: ```bash # 阿里云镜像源 deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib ``` > 其他推荐镜像源(二选一): > ```bash > # 清华大学镜像源 > deb https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free > deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free > > # 浙江大学镜像源 > deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free > deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free > ``` #### 步骤 2:添加 GPG 密钥(新方法) ```bash # 下载并转换密钥格式 curl -fsSL https://archive.kali.org/archive-key.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg # 设置正确权限 sudo chmod 644 /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg ``` #### 步骤 3:更新系统 ```bash # 更新软件包列表 sudo apt update # 升级已安装软件 sudo apt upgrade -y # 完整系统升级(可选) sudo apt dist-upgrade -y ``` --- ### 验证修复效果 ```bash # 检查密钥状态 gpg --show-keys /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg ``` 正常输出应包含: ``` pub rsa4096 2012-03-05 [SC] [有效至:2028-01-02] ED444FF07D8D0BF6 uid [ 未知 ] Kali Linux Repository <devel@kali.org> ``` --- ### 常见问题处理 | 问题现象 | 解决方案 | |---------|----------| | `NO_PUBKEY ED444FF07D8D0BF6` | 手动添加密钥:`sudo gpg --keyserver keyserver.ubuntu.com --recv-keys ED444FF07D8D0BF6` | | `Temporary failure resolving 'mirrors.aliyun.com'` | 更换 DNS:`echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf` | | 系统时间错误导致验证失败 | 同步时间:`sudo apt install ntpdate && sudo ntpdate pool.ntp.org` | > 注:Kali 官方已明确弃用 `apt-key` 命令[^4],使用新方法可避免未来兼容性问题。操作完成后运行 `sudo apt update` 应不再出现签名错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值