解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决
題目大意:
讀入n個字符串,按字典序排序,再按列優先輸出,附加條件每行最多輸出60個字符,在此條件下要求行最少。(最開始沒仔細看題,以為在一行中,每個單詞相隔最長單詞的長度+2,最后一列單詞空間長度為最長單詞的長度,不夠用空格補齊。o(╥﹏╥)o。)
注意點:
1、求行數和列數時,容易想到的方法是O(n)復雜度的遍歷求法,但可以優化為復雜度為O(1)的求法。
2、如果對本題求解過程有清晰的階段劃分,做起來會事半功倍。
最好遵循螺旋模型的法則:將整道題分為若干階段,每完成一階段就測試一下這以前求的值是否正確,如果錯了,馬上改正,確保減少后期Debug的時間。
如:1、將輸入串存入數組后,輸出數組,檢測是否正確存入; 2、求出行數和列數后,輸出行列數,檢測是否正確求出。 期間保證測試多組數據。
3、一維數組按列輸出為二維數組的方法: 當前列*總行數+當前行數。 一維數組按行輸出為二維數組同理。
題目(提交)鏈接→UVa-400
如果不會用vJudge網站,請猛戳這里→vJudge教程
這段代碼借鑒了劉先生求行列數和按列輸出的技巧,但沒有寫print函數,采用#include<iomanip>頭文件中的setw()和setiosflags()設置域寬和左對齊。(代碼在第20行)
代碼:
#include<bits/stdc++.h> using namespace std; const int Maxcols = 60; int main() {int n; while(cin >> n) {vector<string>s; int Max = 0;for(int i = 0; i < n; i++) {string x; cin >> x;s.push_back(x);Max > x.length() ? : Max = x.length();} sort(s.begin(), s.end());int cols = (Maxcols-Max)/(Max+2)+1, rows = ((s.size()+(cols-1))/cols); //求行數和列數for(int i = 0; i < 60; i++) cout << '-'; cout << endl; //輸出------------ for(int r = 0; r < rows; r++) { //按列輸出序列 for(int c = 0; c < cols; c++) {int idx = c * rows + r;if(idx < s.size()) //setw(x)是設置x長的域寬,setiosflags()用來設置左對齊or右對齊; cout << (c==cols-1?setw(Max):setw(Max+2)) << setiosflags(ios::left)<<s[idx]; }cout << "\n";} } return 0; }收獲:
1、螺旋模型測試程序(分成若干階段,完成一階段進行值測試,若值不正確,則迭代修改)
2、按列輸出(一維數組,列*總行數+當前行數)
可優化的:
1、o(1)復雜度求行和列
2、const常量代替常數
日拱一卒,功不唐捐。
總結
以上是生活随笔為你收集整理的解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比紫书优化,14行代码AC——例题 5-
- 下一篇: 21行代码AC——习题5-1 代码对齐(