输入数据包含多行,第一行是共有的题数 n (1 ≤ n ≤ 12)以及单位罚时 m (10 ≤ m ≤ 20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有 n 道题的得分现状,其描述采用问题描述中的数量标记的格式。 负数表示尝试但没通过的次数,正数表示得分,正数+括号表示得分+尝试没通过的次数。
VJ上面G++编译一直WA,C++编译一直Complication Error,而且提示居然是"What do you want to do?"???(本地测试没问题啊) Google的时候发现: 在C++中读取一行的getline函数是不读入换行符的,而gcc / g++ 中getline函数是读入换行符的 但是我本地没法弄个g++来测试,索性就不用getline()了(本来是每次读入一行,然后通过sstream对读入的这一行以空格分解为多个string进行操作)。
intstring::compare(conststring& str)const Returns: 0 : if both strings are equal. A value < 0 : if *this is shorter than str or, first character that does not match is smaller than str. A value > 0 : if *this is longer than str or, first character that does not match is greater
/* 学生成绩结构体 */ structscore { string name;//名字 int n;//本次成绩个数,不过用不到 int p;//pass//多少个通过 int sc;//scores//总得分 score() { n = 0; p = 0; sc = 0; } };
/* 求单项真实分数(原正得分+罚时分),结果返回int分数 */ intrealScore(string s, int m){ bool tried = false;//bool 尝试过 = false,即都对,没被罚时 //扫描左右括号 for (int i = 0; i != s.size(); i++) { if (s.at(i) == '(') { s.at(i) = ' ';//左括号变成空格,方便下一步处理 tried = true;//扫到的话,有被罚时 } if (s.at(i) == ')') { s.at(i) = ' ';//右括号变成空格,方便下一步处理 tried = true;//再写一次 以防万一 }
} for (int i = 0; i != s.size(); i++) {//以防万一string里面不是0~9 if (!(s.at(i) >= 48 && s.at(i) <= 57)) s.at(i) = ' '; } if (tried) {//如果有罚时 istringstreamiss(s);//处理string 使得可以转成int int a, b; iss >> a >> b;//用于处理string 空格分隔 存进两个int里面 return (a + b * m);//a = 原得分 b = 尝试次数 m = 单位罚时 } else {//没有罚时 istringstream iss(s); int a; iss >> a;//string转成int return a;//直接返回得分 } }