NC16783 拼數(簡單排序)

2021-10-06 09:25:58 字數 1793 閱讀 1987

題目描述

設有n個正整數(n ≤ 20),將它們聯接成一排,組成乙個最大的多位整數。

例如:n=3時,3個整數13,312,343聯接成的最大整數為:34331213

又如:n=4時,4個整數7,13,4,246聯接成的最大整數為:7424613

輸入描述

第一行,乙個正整數n。

第二行,n個正整數。

輸出描述:

乙個正整數,表示最大的整數

樣例:輸入

313 312 343

輸出

34331213

這道題對string排序原理不是很了解的同學可能會比較頭疼,而知道string怎麼排序的同學肯定高高興興的開始a題了,心裡還想著「這tm不就是道排序麼」,於是可能就會出現下面的**:(沒錯,上面說的那個憨憨同學就是在下!)

#include

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> p;

#define inf 0x3f3f3f3f

intmain()

sort

(num,num+n)

;for

(int i = n-

1;i >=

0;i--

)}

#include

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> p;

#define inf 0x3f3f3f3f

bool

cmp(string a1,string a2)

intmain()

sort

(num,num+n,cmp)

;for

(int i = n-

1;i >=

0;i--

)}

那麼問題出在哪了呢,是這樣子的:

string的排序並不是根據字串中所有字元的ascii碼的和定大小的,而是先比較兩個字串第乙個字元的ascii碼,如果不相同,那麼ascii碼大的那個字串比另乙個大,如果相同就比較下乙個字元直到出現不同的字元,或者其中乙個後面沒有字元了。

比如「123456789」和「2」雖然看起來比較彆扭但就是「2」 > 「123456789」,

再比如「12345」 > " 1234" ,字串的比較大小就是這樣比較的。

那麼思考一下,「13」,「312」,「343」直接比較大小確實沒什麼問題,排出來以後結果是:「343」,「312」,「13」,拼起來就是「34331213」,和樣例是一樣的。但是仔細想想其實發現這樣是不嚴謹的,可以舉出反例:

例如現在有4個串:「72」,「7」,「7」,」7「,

簡單排序後結果是:」72「,」7「,」7「,」7「,然而明顯72777 < 77772。

那麼要怎麼做呢,就是比較兩個串的兩種組合方式,**表示為:

bool

cmp(string a1,string a2)

因為」72「 + 」7「是」727「,而」7「 + 」72「是」772「,因此應該根據不同組合的大小進行排序,這樣才能求出最大的結果。

1678 設計 Goal 解析器

題目描述 請你設計乙個可以解釋字串 command 的 goal 解析器 command 由 g 和 或 al 按某種順序組成。goal 解析器會將 g 解釋為字串 g 解釋為字串 o al 解釋為字串 al 然後,按原順序將經解釋得到的字串連線成乙個字串。給你字串 command 返回 goal ...

nc 監聽資料 linux包之nc之nc命令

nc 1.84 22.el6.x86 64 不用系統上提供的nc版本會有所不同,其提供的引數使用方法也略有差異 nc v w 1 192.168.2.10 z 1 65535 grep succeeded 埠掃瞄 1.4 強制使用ipv4 2.6 強制使用ipv6 3.d 允許socket通訊返回d...

P1678 煩惱的高考志願

題目背景 計算機競賽小組的神牛v神終於結束了萬惡的高考,然而作為班長的他還不能閒下來,班主任老t給了他乙個艱鉅的任務 幫同學找出最合理的大學填報方案。可是v神太忙了,身後還有一群小姑娘等著和他約會,於是他想到了同為計算機競賽小組的你,請你幫他完成這個艱鉅的任務。題目描述 現有 m m 100000 ...