題目描述
設有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 ...