使用手动读写进行题目完成

众所周知,c++里面的cin,cout等输入输出函数运行时都会有一个缓冲区,这样大大的增加了代码的运行时间,那么,有什么方法使得其运行更快呢?

我们可以用c语言的scanf和printf来输入和输出,从执行速度和效率的角度来看,scanfprintf 通常比 cincout 快。这种差异主要源于以下原因:

  1. 同步与标准 C I/Ocin/cout 与标准 C 的输入输出(即 stdinstdout)保持同步。这意味着每次使用 cincout 时,都会有一些额外的开销,以保持与标准 C I/O 的同步。而 scanfprintf 直接使用标准 C I/O,没有这样的同步开销。

  2. 类型安全和错误检查cin/cout 提供了更好的类型安全和错误检查机制。例如,如果你尝试使用 cin 读取一个整数到一个字符串变量中,编译器会报错或运行时会失败。而 scanf 在这方面就不那么安全,使用不当时容易导致错误。

  3. 格式化的灵活性printfscanf 允许更灵活的格式化,但这也意味着它们需要解析格式化字符串,这可能在某些情况下会稍微减慢速度。不过,这种差异通常非常小,除非是在处理大量数据的情况下。

在竞赛编程中,由于速度非常重要,因此 scanfprintf 往往是更受欢迎的选择。但在需要类型安全、错误检查或代码可读性方面,cincout 可能是更好的选择。

但是如果需要更快的方法怎么办?那么我们可以手动读取,就是所谓的卡常,超级快读快写。

卡常的示例题目:kedaOJ P2852. 小鳄鱼的名字

题目描述

可达信奥的学员上课格外积极。学员每提问一个问题,就要叫一次老师的名字“crocodile”。现在学员们提出了n个问题,你需要输出老师的名字被叫了多少次。

输入格式

共一行,一个整数 n,表示学生提出问题的数量。

输出格式

共一行,表示老师的名字被叫了多少次。

样例

输入数据 1

2

输出数据 1

crocodilecrocodile

提示

数据范围

100% 的数据:n≤100000

用超级快读快写解决:

#include <bits/stdc++.h>
typedef long long ll; 
using namespace std;

namespace IO {
    int len = 0;
    char ibuf[(1 << 20) + 1], *iS, *iT, out[(1 << 25) + 1];
    #define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
    #define reg register
    inline int read() {
        reg char ch = gh();
        reg int x = 0;
        reg char t = 0;
        while (ch < '0' || ch > '9')
            t |= ch == '-', ch = gh();
        while (ch >= '0' && ch <= '9')
            x = x * 10 + (ch ^ 48), ch = gh();
        return t ? -x : x;
    }
    inline void putc(char ch) {
        out[len++] = ch;
    }
    template <class T> inline void write(T x) {
        if (x < 0)
            putc('-'), x = -x;
        if (x > 9)
            write(x / 10);
        out[len++] = x % 10 + 48;
    }
    inline void flush() {
        fwrite(out, 1, len, stdout);
        len = 0;
    }
}
using IO::flush;
using IO::putc;
using IO::read;
using IO::write;

int main() {
    int n = read();

    for(int i = 0; i < n; ++i) {
        const char* crocodile = "crocodile";
        for (int j = 0; crocodile[j] != '\0'; ++j) {
            putc(crocodile[j]);
        }
    }
    flush(); 
    return 0;
}

在main函数前面的就是手动读入/输出的代码

水题还是要解释一下的,代码要求的是输出n遍一个字符串,我们输入n然后使用for循环输出。

本来一道水题直接提升了一个档次,让我们来看一看AC多数据

在来看一看用普通方法写的:

可以看到测试点4在卡常写法下用时2ms但是在普通方法下用时3ms,这个是数据量很小的时候,如果数据量足够大那么速度将会得到较大提升。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值