关于输入和输出
前话
上次在\(luogu\)的比赛失利了,只拿了170分/400分。后来一看用scanf可以直升210……
OI赛制在满分的时候会按你的程序运行时间来排名。
又是\(Luogu\)的\(csp\)模拟赛,上星期去参加了一下,前两题满分,但是又是读入速度的问题,和前面的人断崖式缺了\(100+ms\),结果一看1e6的数据,前面的人全用了快读快写……
切入正题
我不甘心这么就结束这个问题,所以自己在电脑上试了数据,记录实验结果
这里是实验项目,可以自己试试
下面给出两个示例:
输入对比
数据为1~1e7(一千万的数据),下面是各个输入方式的效率对比。
\[cin运行时间:7.661000(s)
\]
\[scanf运行时间:5.200000(s)
\]
\[优化运行时间:1.877000(s)
\]
很明显,快读的效率是最高的,\(scanf\)其次,\(cin\)最后。
你马上会感觉,难道我们的输入占这么多时间?
也许是我的电脑处理的慢
register优化
\(register\ int\),可以加速频繁使用的变量。
\(register\) 表示使用\(cpu\)内部寄存器
比较大小
现在来看看max和min的效率。
数据为1~1e8(一亿的数据),下面是\(STL\)和手写的比大小的对比。
\[不优化运行时间:0.795000(s)
\]
\[优化后运行时间:0.665000(s)
\]
这里在循环里加上了\(register \ int\)和\(手写的max函数\)
然后会发现这里差不了多少,所以想优化就优化吧。
结尾
试验结束后,发现有些优化是不必要的,有些优化可以快很多。
像读和写,都是差距很大的,所以可以在考场上比赛之前把快读快写默一遍。
下面给出优化的code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define in inline
#define rint register int
typedef long long LL;
typedef pair<int,int> PII;
in int read()
{
rint x=0,f=0; register char ch=getchar();
while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return f?-x:x;
}
in void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
in void print(string s)
{
for(int i=0;s[i]!='\0';i++) putchar(s[i]);
}
in int max(int a,int b) {return a>b?a:b;}
in int min(int a,int b) {return a<b?a:b;}
/*----------code----------*/
const int N=1e5+10;
int a[N];
int n,m,k;
int main()
{
return 0;
}
本文来自博客园,作者:{三季野花},转载请注明原文链接:https://www.cnblogs.com/SanGarden/articles/16529557.html