【问题标题】:Time limit exceeded on test 10 code forces测试 10 代码强制超出时间限制
【发布时间】:2020-09-11 22:27:54
【问题描述】:

您好,我是编程初学者,正在学习数组课程,我只知道一些基础知识,例如 if 条件、循环和数据类型,以及当我尝试解决这个问题时。

问题描述

Serezha 三岁时,收到了一套带有字母的生日卡片。它们以二进制形式形成男孩母亲最喜欢的数字的方式排列成单词。 Serezha 立即开始和他们一起玩,并把他们洗牌,因为他还不会阅读。他的父亲决定重新安排他们。帮助他恢复原来的数字,条件是它是最大可能的。

输入规范

第一行包含一个整数 n (1⩽n⩽105) — 字符串的长度。第二行包含一个由英文小写字母组成的字符串:'z'、'e'、'r'、'o'和'n'。

保证可以重新排列字母,使它们形成一个单词序列,每个单词要么是对应于数字 00 的“零”,要么是对应于数字 11 的“一”。

输出规格

以二进制形式打印最大可能的数字。打印以空格分隔的二进制数字。允许前导零。

  1. 示例输入:

     4
     ezor
    

    输出:

     0
    
  2. 示例输入:

     10
     nznooeeoer
    

    输出:

     1 1 0
    

我在测试 10 个代码强制时超出了时间限制,这就是我的代码

#include <iostream>
using namespace std;
int main()
{
    int n;
    char arr[10000];
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    for (int i = 0; i < n; i++) {
        if (arr[i] == 'n') {
            cout << "1"
                 << " ";
        }
    }
    for (int i = 0; i < n; i++) {
        if (arr[i] == 'z') {
            cout << "0"
                 << " ";
        }
    }
}

【问题讨论】:

  • 每个输入都有固定数量的 1 和 0。弄清楚你需要知道什么才能得到这个数字。您当然不需要存储一个充满oe 字符的数组。

标签: c++ algorithm


【解决方案1】:

您的问题是缓冲区溢出。你在堆栈上放了一个糟糕的 10K 数组,但问题描述说你最多可以有 100K 个字符。

数组填满后,您开始覆盖堆栈,包括变量n。这使您尝试读取太多字符。当您的程序到达输入的末尾时,它会永远等待更多。

与其在堆栈上放置一个更糟糕的 100K 数组,不如在读取输入时计算 z 和 n 的数量,根本不用费心存储字符串。

【讨论】:

  • 很好发现和很好的解释。我承认我没有注意到这一点,我的回答(使用相同的解决方案)只是偶然涵盖了这个问题。
【解决方案2】:

根据这里描述的折衷(适用于作业和挑战题)
How do I ask and answer homework questions?
我会提示,不给出代码解决方案。

为了修复 TLE,您需要提高效率。
在这种情况下,我将首先摆脱三个循环之一和所有数组访问。
您只需要在输入和一个输出循环期间计算两件事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 2022-01-06
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多