我正在执行有关C ++中堆栈的数据结构编程任务。
在此作业中,我应该读取很多整数(在最坏的情况下,我应该读取1,600,000个整数),最后输出一些字符串。
作为一名学生,我提交了cpp源文件,然后网站对我的源代码进行了评估和评分。我得到了100%,但我想做得更好。此分配的时间限制为2秒,我的源代码的执行时间为128毫秒。但是,成绩最好的学生仅用52毫秒即可完成任务。所以我想知道如何使我的代码更快。
我的源代码主要包含三个部分:
OnlineJudge告诉我代码的执行时间。第一部分花费100毫秒,第二部分花费20毫秒,而第三部分花费12毫秒。因此,如果我想使代码更快,则应该提高输入速度。
OnlineJudge的输入是这样的:
5 2
1 2 3 5 4
Run Code Online (Sandbox Code Playgroud)
第一行是两个整数n和m,第二行是n个由空格分隔的整数。限制为:1 <= n <= 1,600,000和0 <= m <= 1,600,000。为了读取超过一百万个整数,我的代码是这样的:
#include <iostream>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
int *exit = new int[1600000];
cin>>n>>m;
for (int i=0;i<n;++i)
cin>>exit[i];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果n小,则OnlineJudge会说执行时间为0毫秒。如果n非常大,例如1,600,000。OnlineJudge说此代码需要100毫秒。如果我删除
std::ios::sync_with_stdio(false);
cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)
然后代码需要424毫秒。但是,在此作业中必须读取整数,因此我很好奇顶尖的学生如何在52毫秒内完成“ cin,查找解决方案,退出”。
您对提高输入速度有任何想法吗?
2019.4.17?有人建议使用vector或std :: from_chars,但在此分配中这些被禁止。如果我写
#include <vector>
Run Code Online (Sandbox Code Playgroud)
要么
#include <charconv>
Run Code Online (Sandbox Code Playgroud)
要么
#include <array>
Run Code Online (Sandbox Code Playgroud)
然后OnlineJudge说“编译错误”。
有人建议使用scanf,我的代码如下:
for (int i=0;i<n;++i)
scanf("%d", &exit[i]);
Run Code Online (Sandbox Code Playgroud)
但是执行时间是120毫秒。顺便说一句,我不认为scanf比cin快,在C ++程序中使用scanf()比与cin快?
有人建议使用getline。我很少使用此功能,我的代码如下:
stringstream ss;
string …Run Code Online (Sandbox Code Playgroud)