P14357 [CSP-J 2025] 拼数 / number

题目描述

小 R 正在学习字符串处理。小 X 给了小 R 一个字符串 s s s,其中 s s s 仅包含小写英文字母及数字,且包含至少一个 1 ∼ 9 1 \sim 9 19 中的数字。小 X 希望小 R 使用 s s s 中的任意多个数字,按任意顺序拼成一个正整数。注意:小 R 可以选择 s s s 中相同的数字,但每个数字只能使用一次。例如,若 s s s 1 a 01 b \tt 1a01b 1a01b,则小 R 可以同时选择第 1 , 3 , 4 1,3,4 1,3,4 个字符,分别为 1 , 0 , 1 1,0,1 1,0,1,拼成正整数 101 101 101 110 110 110;但小 R 不能拼成正整数 111 111 111,因为 s s s 仅包含两个数字 1 1 1。小 R 想知道,在他所有能拼成的正整数中,最大的是多少。你需要帮助小 R 求出他能拼成的正整数的最大值。

输入格式

输入的第一行包含一个字符串 s s s,表示小 X 给小 R 的字符串。

输出格式

输出一行一个正整数,表示小 R 能拼成的正整数的最大值。

输入输出样例 #1

输入 #1

5

输出 #1

5

输入输出样例 #2

输入 #2

290es1q0

输出 #2

92100

说明/提示

【样例 2 解释】

s s s 包含数字 2 , 9 , 0 , 1 , 0 2,9,0,1,0 2,9,0,1,0。可以证明,小 R 拼成的正整数的最大值为 92100 92100 92100

【样例 3】

见选手目录下的 n u m b e r / n u m b e r 3. i n number/number3.in number/number3.in n u m b e r / n u m b e r 3. a n s number/number3.ans number/number3.ans。该样例满足测试点 9 ∼ 11 9 \sim 11 911 的约束条件。

【样例 4】

见选手目录下的 n u m b e r / n u m b e r 4. i n number/number4.in number/number4.in n u m b e r / n u m b e r 4. a n s number/number4.ans number/number4.ans。该样例满足测试点 20 20 20 的约束条件。

【数据范围】

∣ s ∣ |s| s 为字符串 s s s 的长度。对于所有测试数据,保证:

  • 1 ≤ ∣ s ∣ ≤ 1 0 6 1 \leq |s| \leq 10^6 1s106
  • s s s 仅包含小写英文字母及数字,且包含至少一个 1 ∼ 9 1 \sim 9 19 中的数字。

::cute-table{tuack}

测试点编号 ∣ s ∣ ≤ \lvert s\rvert \leq s 特殊性质
1 1 1 1 1 1 A
2 2 2 2 2 2 ^
3 3 3 ^
4 4 4 10 10 10 A
5 , 6 5,6 5,6 ^
7 , 8 7,8 7,8 1 0 2 10^2 102 A
9 ∼ 11 9 \sim 11 911 ^
12 12 12 1 0 3 10^3 103 A
13 , 14 13,14 13,14 ^
15 15 15 1 0 5 10^5 105 A
16 , 17 16,17 16,17 ^ B
18 , 19 18,19 18,19 ^
20 20 20 1 0 6 10^6 106 A
21 , 22 21,22 21,22 ^ B
23 ∼ 25 23 \sim 25 2325 ^
  • 特殊性质 A: s s s 仅包含数字。
  • 特殊性质 B: s s s 仅包含不超过 1 0 3 10^3 103 个数字。

解题思路想清楚,代码非常easy

题意:输入字符串,仅包含小写英文字母及数字,且包含至少一个 1∼9 中的数字,输出使用其中任意多个数字字符拼成的最大正整数,且每个数字字符只能用一次,存在两个相同的则每个都可以用一次。

解析:要想得到的正整数最大,自然位数越长越好,每一个数字越大越好。则应该将所有的数字字符都用上,且从前往后依次为较大的数字字符。

解决方案:将所有字符升序排序,则字符串字符顺序为:小写字母a~z,数字字符 ′ 0 ′ '0' 0~ ′ 9 ′ '9' 9,此时从后往前依次输出数字字符,得到的即是最大正整数。

#include<bits/stdc++.h>
using namespace std;
int main(){
	char arr[1000001];
	cin>>arr;
	int len=strlen(arr);
	sort(arr, arr+len);
	for(int i=len-1; i>=0; i--){
		if(isdigit(arr[i]))
			cout<<arr[i]; 
	}
	return 0;
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐