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