如何使此代码更短以更快地完成
How to make this code shorter to do faster
我是新的 c++ 学习者。我登录了Codeforce网站,这是11A问题:如果 ai - 1 效果很好。但在测试代码强制服务器中输入 2000 数字。时间限制为 1 秒。但它最多计算 1 秒。如何使此代码更短以更快地计算?#include <iostream>
using namespace std;
int main()
{
long long int n,d,ci,i,s;
s=0;
cin>>n>>d;
int a[n];
for(ci=0;ci<n;ci++)
{
cin>>a[ci];
}
for(i=0;i<(n-1);i++)
{
while(a[i]>=a[i+1])
{
a[i+1]+=d;
s+=1;
}
}
cout<<s;
return 0;
}
可以进行的一项改进是使用
std::ios_base::sync_with_stdio(false);
默认情况下,cin/cout 会浪费时间将自身与 C 库的 stdio 缓冲区同步,以便您可以自由地将对 scanf/printf 的调用与 cin/cout 上的操作混合在一起。通过使用上述调用关闭此功能,上述程序中的输入和输出操作应该花费更少的时间,因为它不再初始化输入和输出的同步。
众所周知,这在以前的代码挑战中有所帮助,这些挑战要求代码在特定的时间范围内完成,并且 c++ 输入/输出导致速度出现一些瓶颈。
你可以摆脱while循环。您的程序应该运行得更快,没有
#include <iostream>
using namespace std;
int main()
{
long int n,d,ci,i,s;
s=0;
cin>>n>>d;
int a[n];
for(ci=0;ci<n;ci++)
{
cin>>a[ci];
}
for(i=0;i<(n-1);i++)
{
if(a[i]>=a[i+1])
{
int x = ((a[i] - a[i+1])/d) + 1;
s+=x;
a[i+1]+=x*d;
}
}
cout<<s;
return 0;
}
这不是一个完整的答案,而是一个提示。
假设我们的顺序是 {1000000, 1}
,d
是 2。
为了增加序列,我们需要使第二个元素 1,000,001 或更大。
我们可以按照你的方式做,反复添加 2 直到我们超过 1,000,000
1 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + ...
这需要一段时间,或者我们可以说
- 我们的目标是 1,000,001
- 我们有 1
- 差额为 1,000,000
- 所以我们需要做 1,000,000/2 = 500,000 次加法
所以答案是50万。
这要快得多,因为我们只做了 1 次加法 (1,000,000 + 1)、一次减法 (1,000,001 - 1) 和一个除法 (1,000,000/2),而不是做五十万次加法。
正如@molbdnilo所说,用数学来摆脱循环,这很简单。这是我的代码,被Codeforce接受。
#include <iostream>
using namespace std;
int main()
{
int n = 0 , b = 0;
int a[2001];
cin >> n >> b;
for(int i = 0 ; i < n ; i++){
cin >> a[i];
}
int sum = 0;
for(int i = 0 ; i < n - 1 ; i++){
if(a[i] >= a[i + 1]){
int minus = a[i] - a[i+1];
int diff = minus / b + 1;
a[i+1] += diff * b;
sum += diff;
}
}
cout << sum << endl;
return 0;
}
我建议你分析你的代码,看看瓶颈在哪里。
浪费时间的热门领域之一是输入。 输入请求越少,程序的速度就越快。
因此,您可以通过从cin
读取read()
到缓冲区中,然后使用 istringstream
解析缓冲区来加快程序速度。
其他技术包括循环展开和优化数据缓存。 减少分支或if
语句的数量也将加快程序速度。 处理器更喜欢处理数据和移动数据,而不是跳转到代码中的不同区域。
- 此代码是否违反一个定义规则
- 此代码编译良好,但文件未创建?请指出错误
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 为什么在同一条件变量上使用多个互斥锁会使此代码崩溃?
- 如何用逗号分隔输出?如何改进此代码以使其看起来更体面?
- 此代码是否容易受到 SQL 注入的攻击?我该如何使其安全
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 使此 C++ 代码通用
- 如何使用 openMP 使此代码线程安全
- 需要一种方法来使此代码运行得更快
- 任何帮助使此代码更小的C ++
- C++模板.如何使此代码更漂亮
- 如何仅使用if-else语句(no-for、do/while等)使此代码循环一定次数?(c++)
- 如何使此代码工作
- 如何使此代码更短以更快地完成
- 如何使此代码适用于不同计算机上的服务器和客户端
- 如何使此串行配置代码可配置
- 我该如何编辑此代码以使其成为最小堆
- 如何使此代码中的线程独立运行
- 如何使此代码更快(学习最佳实践)