第十三周项目——oj平台的问题(1)

/*
 *Copyright (c) 2014, 烟台大学计算机学院
 * All right reserved.
 * 文件名称:test.cpp
 * 作者:陈丹
 * 完成时间:2014年11月22号
 * 版本号:v1.0
 *
 *问题描述:创建一个有10个元素的整型数组,从后往前(从第9个到第0个)输出数组中元素的值
 *输入描述:无输入
 *程序输出:输出数组中的元素
 */
#include <iostream>
#include <cstdio>
using namespace std;
const int SIZE=10;
int main()
{
    int a[SIZE]={},i;
    for (i=0;i<=9;++i)
    {
        cin>>a[i];
    }
    for(i=9;i>=0;--i)
{
    cout<<a[i]<<' ';
}
    return 0;
}


运行结果:

感谢你提供的反馈!我们来**逐步分析问题**,并修正代码。 --- ### ❌ 问题定位: 从你的测试输入和输出来看: #### 输入: ``` 2 ``` #### 预期输出: ``` 1 1 1 ``` #### 实际输出(错误): ``` 1 1 1 1 1.0 1.0 ``` 说明原代码中存在以下 **严重问题**: 1. **输出了多余的行或数字**:比如 `1 1 1` 明显多了一个 `1` 2. **输出格式不正确**:不应该有两行关于距离的输出(出现了 `1 1` 和 `1.0 1.0`) 3. **变量打印混乱**:可能是调试时遗留的 `print` 语句未清除 这说明原始代码在逻辑或输出部分有明显错误。 --- ### ✅ 正确理解题目: - 墙厚 `wall` 尺 - 两只老鼠从两边打洞,**每天同时推进** - 大鼠第1天打 1 尺,之后每天翻倍 → 第二天 2,第三天 4,第四天 8 ... - 小鼠第1天打 1 尺,之后每天减半 → 第二天 0.5,第三天 0.25,第四天 0.125 ... - 求:**第几天它们打通墙相遇?** - 输出: - 第一行:天数(整数) - 第二行:小鼠总进度、大鼠总进度(保留一位小数,用 `round(x, 1)`) > ⚠️ 关键:不能使用幂运算(如 `**` 或 `pow()`),必须用循环模拟每日增长/衰减 > ⚠️ 必须使用 `round(..., 1)` 来格式化浮点数 --- ### ✅ 正确解法(Python 实现): ```python wall = int(input()) day = 0 total_small = 0.0 # 小鼠累计打洞长度 total_big = 0.0 # 大鼠累计打洞长度 progress_small = 1.0 # 小鼠当天进度,初始为1 progress_big = 1.0 # 大鼠当天进度,初始为1 while total_small + total_big < wall: day += 1 # 加上当天的进度 total_small += progress_small total_big += progress_big # 更新下一天的进度(但最后一天不需要更新,不过不影响) progress_small /= 2.0 # 每天减半 progress_big *= 2.0 # 每天翻倍 # 输出结果 print(day) # 使用 round 保留一位小数 small_rounded = round(total_small, 1) big_rounded = round(total_big, 1) print(small_rounded, big_rounded) ``` --- ### 🔍 代码解释: | 变量 | 含义 | |------|------| | `day` | 当前是第几天 | | `total_small`, `total_big` | 累计打洞长度 | | `progress_small`, `progress_big` | 当天的打洞速度 | - 循环条件:两者总长度未穿透墙时继续 - 每天先累加当天工作量,再更新下一天的速度 - 不使用 `**` 运算,完全通过乘除实现 - 最后使用 `round(x, 1)` 格式化输出 --- ### ✅ 示例验证: #### 示例 1:`wall = 10` | Day | 小鼠当日 | 小鼠累计 | 大鼠当日 | 大鼠累计 | 总长 | |-----|----------|-----------|----------|-----------|-------| | 1 | 1 | 1 | 1 | 1 | 2 | | 2 | 0.5 | 1.5 | 2 | 3 | 4.5 | | 3 | 0.25 | 1.75 | 4 | 7 | 8.75 | | 4 | 0.125 | 1.875 | 8 | 15 | 超过10 → 在第4天相遇 | 但在第4天中途就相遇了,但我们只记录**完整天数**,且只累加到相遇那天为止。 > 注意:我们的程序是在第4天开始后,加上当天的工作量(即使超出也计入),这是符合题意的——“第几天相逢”是指在这一天完成动作后首次超过或等于墙厚。 所以第4天才满足 `sum >= 10`,因此输出 `4` 最终输出: ``` 4 1.9 15 -> 但注意:实际上我们不会让大鼠打满8尺 ``` ⚠️ 等等!这里有问题! --- ### 🚨 更正:题目是“何时相逢”,不是“打完当天” 我们必须意识到:老鼠可能在某一天**中途相遇**,而不是一定要打完整天才算。 但本题约定通常采用“**按整天计算,直到累计长度 ≥ 墙厚**”,即认为它们在这一天打通。 但是观察示例: #### 示例1 输入:10 → 输出:4 和 `1.8 8.2` 说明并不是简单把前几天加起来! 这意味着我们需要做更精确处理:**在最后一天,按比例分配当天的工作量** --- ## ✅ 正确做法:带比例截断的版本(高精度) 因为示例输出是 `1.8` 和 `8.2`,而如果我们直接加前3天: - 小鼠:1 + 0.5 + 0.25 = 1.75 - 大鼠:1 + 2 + 4 = 7 - 总计:8.75 还剩:1.25 尺 第4天: - 小鼠计划打 0.125 - 大鼠计划打 8 - 总共能打 8.125 → 但只需要 1.25 所以它们会在第4天以一定比例完成。 设它们用了第4天的 $ r $ 比例时间相遇,则: $$ r \times 0.125 + r \times 8 = 1.25 \Rightarrow r(8.125) = 1.25 \Rightarrow r = \frac{1.25}{8.125} = \frac{10}{65} = \frac{2}{13} $$ 于是: - 小鼠补上:$ 0.125 \times \frac{2}{13} \approx 0.01923 \to 总共 ≈ 1.769 $ - 大鼠补上:$ 8 \times \frac{2}{13} \approx 1.23077 \to 总共 ≈ 8.230 $ 但示例输出是 `1.8` 和 `8.2` —— 接近但不一致? 等等,再看示例输出: > 输出: > ``` > 4 > 1.8 8.2 > ``` 1.8 + 8.2 = 10.0 ✅ 所以我们必须调整思路:**题目允许我们在最后一天按需分配工作量** --- ## ✅ 最终算法(精确到最后一天的比例) ```python wall = float(input()) total_small = 0.0 # 小鼠已打长度 total_big = 0.0 # 大鼠已打长度 progress_small = 1.0 # 当日进度(逐日减半) progress_big = 1.0 # 当日进度(逐日翻倍) day = 0 while True: day += 1 # 预测如果今天全打完,是否会穿透? if total_small + progress_small + total_big + progress_big >= wall: # 相遇在今天,需要计算剩余多少 remaining = wall - total_small - total_big # 假设以恒定速度同时挖,所需时间为比例 r r = remaining / (progress_small + progress_big) # 各自在这段时间内打了多少 add_small = r * progress_small add_big = r * progress_big total_small += add_small total_big += add_big break else: # 今天安全打完 total_small += progress_small total_big += progress_big # 更新下一天进度 progress_small /= 2.0 progress_big *= 2.0 # 输出 print(day) small_out = round(total_small, 1) big_out = round(total_big, 1) print(small_out, big_out) ``` --- ### ✅ 验证示例 1:`wall = 10` - 第1天:小1,大1 → 共2 < 10 → 继续 - 第2天:小0.5,大2 → 共3.5,累计5.5 < 10 → 继续 - 第3天:小0.25,大4 → 共4.25,累计 5.5+4.25=9.75 < 10 → 继续 - 第4天:小0.125,大8 → 总能力 8.125,当前总共已打 9.75,还需 0.25 → 判断是否穿透:`9.75 + 8.125 = 17.875 > 10` → 是,在第4天相遇 剩余:`0.25` 所需比例:`r = 0.25 / (0.125 + 8) = 0.25 / 8.125 ≈ 0.03077` - 小鼠增加:`0.125 × 0.03077 ≈ 0.003846` → 总共:`0.25 + 之前1.75?` 等一下,重新整理累计值: | Day | 小鼠累计 | 大鼠累计 | |-----|----------|----------| | 1 | 1 | 1 | | 2 | 1.5 | 3 | | 3 | 1.75 | 7 | | → 剩余 1.25(不是0.25!前面错了) 前面累计:1.75 + 7 = 8.75 → 剩余 1.25 第4天两人合计可打:0.125 + 8 = 8.125 比例:`r = 1.25 / 8.125 = 0.153846...` - 小鼠补:`0.125 × 0.153846 ≈ 0.01923` → 总共:1.75 + 0.01923 ≈ 1.769 → round → 1.8 - 大鼠补:`8 × 0.153846 ≈ 1.23077` → 总共:7 + 1.23077 ≈ 8.23077 → round → 8.2 ✅ 输出: ``` 4 1.8 8.2 ``` 完美匹配! --- ### ✅ 验证示例 2:`wall = 2` - 第1天:小1,大1 → 总共2 ≥ 2 → 会在第1天相遇 - 剩余:2 - 0 = 2 - r = 2 / (1 + 1) = 1 → 即打满一整天 - 所以小鼠打 1×1 = 1,大鼠打 1×1 = 1 - 输出: ``` 1 1.0 1.0 → 但 round 后是 1.0,显示为 1.0 还是 1? 但根据 Python 的 `round(1.0, 1)` 输出是 `1.0`,但显示为最短形式 → `1.0` 显示为 `1.0`?其实不是! 让我们测试: ```python >>> round(1.0, 1) 1.0 >>> print(round(1.0, 1)) 1.0 ``` 但它会输出 `1.0`,而预期是 `1 1` 但题目说:“若计算结果是浮点数保留小数点后1位”,而 `1.0` 保留一位就是 `1.0`,但输出应为数值形式。 然而,**题目示例输出是 `1 1`,没有 `.0`** 这说明:当结果是整数时,即使用了 `round`,我们也希望输出整数形式? 但 `round(1.0, 1)` 返回的是浮点数 `1.0`,`print(1.0)` 输出 `1.0` 还是 `1`? 在 Python 中: ```python print(1.0) # 输出 1.0 print(1.1) # 输出 1.1 ``` 但我们想要:如果是整数值(如 1.0),输出 `1`;否则输出 `x.x` 但题目要求使用 `round(x, 1)`,并且“得到的数据值为浮点数数值形式”,所以我们不能强制转成整数。 但注意:**示例输出是 `1 1`,说明可以接受整数形式** 我们可以这样处理: ```python def format_float(x): x = round(x, 1) if x == int(x): return str(int(x)) else: return str(x) # 然后 print(format_float(total_small), format_float(total_big)) ``` 但题目没要求字符串格式,只要求数值形式,并且 `round` 即可。 而实际判题系统通常接受 `1.0` 和 `1` 视为等价,但如果严格比对文本就不行。 --- ### ✅ 最终解决方案(确保输出格式正确) 由于题目输出示例是: ``` 1 1 1 ``` 而不是 ``` 1 1.0 1.0 ``` 我们必须判断是否为整数,决定输出格式。 虽然 `round(x,1)` 是浮点数,但我们可以通过格式化避免 `.0` --- ### ✅ 改进版输出方式(推荐用于 OJ 判题) ```python wall = float(input()) total_small = 0.0 total_big = 0.0 progress_small = 1.0 progress_big = 1.0 day = 0 while True: day += 1 combined_today = progress_small + progress_big remaining = wall - total_small - total_big if remaining <= combined_today: # 相遇在第 day 天 r = remaining / combined_today total_small += r * progress_small total_big += r * progress_big break else: total_small += progress_small total_big += progress_big # 更新下一天进度 progress_small /= 2.0 progress_big *= 2.0 print(day) # 格式化输出:保留一位小数,但整数不显示 .0 def fmt(x): x = round(x, 1) return str(int(x)) if x == int(x) else str(x) small_str = fmt(total_small) big_str = fmt(total_big) print(small_str, big_str) ``` --- ### ✅ 测试: - `wall=2` → 输出 `1` 和 `1 1` ✅ - `wall=10` → 输出 `4` 和 `1.8 8.2` ✅ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值