UVA 11340 Newspaper题本地与udebug测试通过OJ返回Wrong Answer求解
问题描述
我为OnlineJudge平台的11340题编写了解题代码,该题要求读取一篇文章,基于给定的字符单价列表计算整段内容的成本。
我的代码在题目给出的测试用例以及udebug平台的额外测试用例中均能输出正确结果,但提交到OJ后却返回Wrong Answer。此前我在该平台也遇到过类似问题:本地运行正常的代码因一些无关原因被拒,例如使用cin输入不通过但替换为scanf即可正常通过。
我的原始代码如下:
#include <iostream> #include <string> #include <cstdio> using namespace std; // 思路:用数组存储每个字符的单价,数组下标对应字符的ASCII值,读取文章后直接累加成本即可 int main(){ int t; scanf("%d",&t); while(t--){ float cost = 0.0; // 最终成本 int K; cin >> K; // 有定价的字符数量 int char_costs[300] = {0}; // 下标对应字符ASCII值,存储对应单价(单位:分),300是预留冗余,128也可覆盖标准ASCII char character; for(int i = 0; i < K; i++){ cin >> character; // 读取字符 cin >> char_costs[(int)character]; // 存储该字符的单价 } int M; cin >> M; // 待统计的文章行数 string current_line; // 存储当前读取的行 for(int i = 0; i <= M; i++){ getline(cin,current_line); // 读取行 // 遍历当前行的每个字符累加成本 for(int current_char = 0; current_char <= current_line.length(); current_char++){ cost += char_costs[current_line[current_char]]; } } cost /= 100.0; // 分转元 printf("%.2lf$\n",cost); // 输出结果 } }
错误原因与修复方案
- 行读取逻辑错误:使用
cin >> M读取行数后,输入缓冲区会残留换行符,第一次调用getline会读到空字符串,同时循环条件i <= M会导致多读取一行,本应读M行实际读了M+1次。修复方法是读取M后先忽略缓冲区残留的换行符,循环条件改为i < M。 - 字符串遍历越界:字符串的合法索引范围是
0 到 length()-1,循环条件current_char <= current_line.length()会访问到字符串末尾的\0字符,属于不规范写法,修复为current_char < current_line.length()。 - 浮点数精度风险:
float类型精度较低,字符量大时可能出现计算误差,建议改用double类型存储总成本。 - 输入混用风险:混合使用
scanf和cin时建议关闭C++输入输出同步,避免OJ环境下读取异常,可在main函数开头添加同步关闭语句。 - 扩展ASCII兼容问题:如果字符属于扩展ASCII范围,有符号char类型会转为负数导致数组下标越界,读取字符时转
unsigned char可规避该问题。
修复后代码
#include <iostream> #include <string> #include <cstdio> #include <limits> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while(t--){ double cost = 0.0; int K; cin >> K; int char_costs[300] = {0}; char character; for(int i = 0; i < K; i++){ cin >> character; cin >> char_costs[(unsigned char)character]; } int M; cin >> M; // 忽略缓冲区残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); string current_line; for(int i = 0; i < M; i++){ getline(cin,current_line); for(int current_char = 0; current_char < current_line.length(); current_char++){ cost += char_costs[(unsigned char)current_line[current_char]]; } } cost /= 100.0; printf("%.2lf$\n",cost); } return 0; }
内容的提问来源于stack exchange,提问作者crispo12
相关产品推荐
相关产品推荐

