You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:39:03