对于很多的Oier,输入的快慢直接影响到评测的结果,NOI2011道路修建一题的输入量非常的恐怖,于是找了常用的几种输入方式,做一次横向比拼。
评测软件:cena
评测数据:noi2011道路建设后五个测试点,输入完毕,输出“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即可。
对于这个结果,我多少有些吃惊。long long比int读入要慢,是合乎情理的。
但是同学说文件先fread再读入要更快,但是文件fread却没有getchar()快- -;
可能是有一些方式处理的不太得当(求大神指点一二)。
所以说如果用cin的话noi直接就跪了,scanf压力也好大~话说一个点才给两秒。
输入就占一半的话,O(n)的想拿AC也是可望不可即的。
所以常备几种输入输出方式,对自己会有很大帮助的。
(完)