1 条题解

  • 2
    @ 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

信息

难度
8
分类
其他 | 排序模拟 点击显示
标签
(无)
递交数
155
已通过
15
通过率
10%
上传者