設有n個正整數,將它們聯接成一排,組成乙個最小的多位整數。剛開始,考慮先將所有排序,比較難處理的地方就是一串是另乙個串的子串,這種情況下,例如:n=2時,2個整數32,321連線成的最小整數為:32132,
n=4時,4個整數55,31,312, 33 聯接成的最小整數為:312313355
收起
第1行:1個數n。(2 <= n <= 10000)
第2 - n + 1行:每行1個正整數。(1 <= a[i] <= 10^9)
輸出拼在一起的最小整數。由於資料量太大,請以1000個字元為單位,輸出到一行裡,
最終剩餘的不足1000個字元的部分,輸出到單獨1行。
4
5531
31233
312313355
長的肯定在後面,然後什麼情況家要把長串的移動到前面,即短串加上長的串,這樣的思路是
不對的,具體為什麼,不得而知,只知道有特殊樣例過不了。
正確的思路是:
交換相鄰兩個串a,b會使答案變差當且僅當a+b(下面沒看懂... ...)
用num(s)表示s對應的十進位制數,
則有num(a)*10^|b|+num(b)整理一下可得num(a)/(10^|a|-1)即自定義cmp函式為: s1+s2using namespace std;
typedef pairp;
typedef long long ll;
const int n=2e5+20;
const int m=30;
string str[n];
bool cmp(string s1,string s2)
str[n];
bool cmp(string s1,string s2)
{ return s1.s>n)
{ ans="";
for(int i=1;i<=n;i++)cin>>str[i].s,str[i].len=str[i].s.length();
sort(str+1,str+1+n,cmp);
for(int i=1;ithe end;
1097 拼成最小的數
1097 拼成最小的數 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 設有n個正整數,將它們聯接成一排,組成乙個最小的多位整數。例如 n 2時,2個整數32,321連線成的最小整數為 32132,n 4時,4個整數55,31,312,33 聯接成的最小整數為 3...
51Nod 1097 拼成最小的數
acm模版 排序,然後按照輸出規定輸出即可。這裡的重點是排序準則 如果兩個數長度一樣,則從小到大排 如果兩個數長度不一樣,則從高位開始比較,依然遵循從小到大排 比如說1 12,11 12,11 112 1122 重要的事說一遍,細節決定成敗!要盡量考慮完全各種情況,尤其是當a是b字首時的情況!如 4...
51NOD 1097 拼成最小的數
1097 拼成最小的數 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 收藏關注 設有n個正整數,將它們聯接成一排,組成乙個最小的多位整數。例如 n 2時,2個整數32,321連線成的最小整數為 32132,n 4時,4個整數55,31,312,33 聯接成的最小...