C++常见几种输入方法评测(int && long long)

一.概览

对于很多的Oier,输入的快慢直接影响到评测的结果,NOI2011道路修建一题的输入量非常的恐怖,于是找了常用的几种输入方式,做一次横向比拼。
  1. cin
  2. cin(打消iostream的输入输出缓存)
  3. scanf
  4. getchar()逐个字符读入
  5. fread将文件读入内存,再逐个字符读入
  6. cin (long long)
  7. cin(打消iostream的输入输出缓存) (long long)
  8. scanf (long long)
  9. getchar()逐个字符读入 (long long)
  10. fread将文件读入内存,再逐个字符读入 (long long)

二.环境介绍

评测软件:cena
评测数据:noi2011道路建设后五个测试点,输入完毕,输出“1”;
C++常见几种输入方法评测(int && long long)_第1张图片
评测环境:
处理器:Intel pentium G530 2.4GHZ 双核
内存:DDR3 1333 2GB 双通道

三.评测方式介绍

1.cin

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

int n,a,b,c;
int main()
{
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    cin>>n;
    for(int i=1;icin>>a>>b>>c;
    }
    cout<<"1"<return 0;
}

cin(打消iostream的输入输出缓存)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

int n,a,b,c;
int main()
{
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;icin>>a>>b>>c;
    }
    cout<<"1"<return 0;
}

2.scanf

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

int n,a,b,c;
int main()
{
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;iscanf("%d%d%d",&a,&b,&c);
    }
    cout<<"1"<return 0;
}

4.getchar()逐个字符读入(原创)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;

inline int read()
{
    char k=0;char ls;ls=getchar();for(;ls<'0'||ls>'9';k=ls,ls=getchar());
    int x=0;for(;ls>='0'&&ls<='9';ls=getchar())x=x*10+ls-'0';
    if(k=='-')x=0-x;return x;
}
int n,a,b,c;
int main()
{
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    n=read();
    for(int i=1;icout<<"1"<return 0;
}

5.fread将文件读入内存,再()逐个字符读入
(非原创,代码源自吉大附中popoqqq)
http://blog.csdn.net/popoqqq/article/details/39962891

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
inline int getc() {
    static const int L = 1 << 15;
    static char buf[L], *S = buf, *T = buf;
    if (S == T) {
        T = (S = buf) + fread(buf, 1, L, stdin);
        if (S == T)
            return EOF;
    }
    return *S++;
}
inline int read() {
    int c;
    while(!isdigit(c = getc()) && c != '-');
    bool sign = c == '-';
    int tmp = sign ? 0 : c - '0';
    while(isdigit(c = getc()))
        tmp = (tmp << 1) + (tmp << 3) + c - '0';
    return sign ? -tmp : tmp;
}
int n,a,b,c;
int main()
{
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
    n=read();
    for(int i=1;icout<<"1"<return 0;
}

6~10
将所有int改为long long即可。

四.评测中…

五.评测结果

C++常见几种输入方法评测(int && long long)_第2张图片

六.评测总结

对于这个结果,我多少有些吃惊。long long比int读入要慢,是合乎情理的。
但是同学说文件先fread再读入要更快,但是文件fread却没有getchar()快- -;
可能是有一些方式处理的不太得当(求大神指点一二)。
所以说如果用cin的话noi直接就跪了,scanf压力也好大~话说一个点才给两秒。
输入就占一半的话,O(n)的想拿AC也是可望不可即的。
所以常备几种输入输出方式,对自己会有很大帮助的。

(完)

你可能感兴趣的:(输入输出)