時間限制:1秒 記憶體限制:128兆
91 次提交 36 次通過
題目描述
現有n個k位的數字,你的任務是重新安排數字每一位的位置,使得重新安排後這n個數字中最大的數字和最小的數字之差的絕對值最小,對於每一位的調整是相對於所有的數字的,例如有3個數字1234、4321和7890,重新安排的方案是交換第二位和第三位,則3個數字變為1324、4231和7980。
輸入輸入包括多組樣例,每組樣例包括多行。每組樣例的第一行包括2個整數n和k,分別代表數字的個數和位數(1 ≤ n, k ≤ 8),接下來的的n行包括n個k位的數字,允許調整後的數字有前導0(例如000123代表123)。
輸出每組資料輸出乙個整數,為調整後最大數字與最小數字之間的最小差值。
樣例輸入
3 3010909
0126 4
5237
2753
7523
5723
5327
2537
樣例輸出
32700
提示第二組樣例可以將原順序(1,2,3,4)調整為(3,1,4,2),則第二個數字變為5237,第三個數字變為2537,分別為這樣變換後的最大值和最小值,可以驗證這樣變換後的差值2700為最小差值。
分析:直接k!的去列舉全排列,將所有列都重新排列,然後暴力處理出來每一行的新數字,再維護乙個最大值乙個最小值相減即可。
陣列a用來記錄輸入的字串,陣列b用來記位數,然後進行全排列,陣列c用來裝陣列a全排列後的值,注意陣列c要清零
要用到next_permutation全排列,自動生成下個序列!詳細解釋請參考我的部落格!
下面附上ac**:
1 #include 2using
namespace
std;
3char a[10][10];4
intmain()529
}30 sort(c+1,c+1+n);//
排序,將陣列c中的值進行公升序排列
31 output=min(output,c[n]-c[1]);//
維護乙個最大值乙個最小值相減,求最小差值32}
33 cout35return0;
36 }
數字排列 (HUST 1586)
現有n個k位的數字,你的任務是重新安排數字每一位的位置,使得重新安排後這n個數字中最大的數字和最小的數字之差的絕對值最小,對於每一位的調整是相對於所有的數字的,例如有3個數字1234 4321和7890,重新安排的方案是交換第二位和第三位,則3個數字變為1324 4231和7980。input 輸入...
騰訊 數字排列
宣告 題目來自 http blog.csdn.net v july v archive 2010 11 17 6015165.aspxhttp blog.csdn.net v july v archive 2011 01 10 6126406.aspx自己先做一遍。題目 初看此題,貌似很難,10分鐘...
排列數字問題
數字排列問題 今有7對數字 兩個1,兩個2,兩個3,兩個7,把它們排成一行。要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列 17126425374635 當然,如果把它倒過來,也是符合要求的。請你找出另一種符合要求的排列法,並且這...