1 条题解
-
2Orina_zju LV 8 MOD @ 2019-01-28 18:05:08
评测时发现Vijos并不会检查空格的个数……也就是说一些错误的排版代码实际上也是可以过的……
1.前20%数据
注意数据范围:\(N < 10; \phantom{x} 10 \le s_{i,j} < 100; \phantom{x} 100 \le \sum_{j=1}^{K} s_{i,j} < 1000; \phantom{x} 10^6 \le C_i < 10^7\),也就是说该部分测试点每一列的宽度都是固定的,直接输出然后中间打2个空格就行。
2.100%数据
由于学号的数值范围超出了64位整数的存储能力,因此学号必须用字符串表示。比较学号时首先比较两个字符串的长度,若长度相等则按字典序比较。bool operator < (const student_t& A, const student_t& B) { if (A.total_score != B.total_score) return A.total_score > B.total_score; //总分高的排在前边 //然后比较两人的学号 if (A.id_len != B.id_len) return A.id_len < B.id_len; //1.如果用字符数组(const char*)表示字符串,则比较时必须用<cstring>定义的strcmp函数,strcmp(A,B)的返回值r分别对应:r>0 => A小于B;r==0 => A与B相等;r>0 => A大于B return strcmp(A.id, B.id) < 0; //2.如果用std::string表示字符串,直接用operator<比较即可 }
之后是本题(可能)最大的难点,如何按照要求右对齐排版。
(1)
printf("%*d", width, value)
我们知道printf
函数可以在%与数据类型符号之间加一个正整数来指定输出的宽度,左边多出的部分用空格填充。例如int v = 234; printf("%6d", v);
的输出结果是...234
(由于排版问题,空格用.
代替,下同)。考虑到很多时候输出宽度是编译期间无法确定的(比如本题),因此printf
函数支持用一个星号代替宽度值,输出宽度在函数参数中指定,输出的值紧随其后。例如int w = 4, v = 234; printf("%*d", w, v);
的输出结果是.234
。(2)
std::cout << std::setw(width) << value
在输出流中,std::setw
可以为其后的一个参数指定输出宽度,多余的部分默认用空格填充。例如(1)中的例子可以等价地写成:int w = 4, v = 234; std::cout << std::setw(w) << v;
。处理各个学生的信息时,分别统计一下学号、各科成绩、总成绩的最大字符数,然后按照上述方法右对齐输出。
- 1