c++ - 如何减少以下代码在 C++ 中的执行时间?

标签 c++ arrays sorting

我编写的这段代码的执行时间为 3.664 秒,但时间限制为 3 秒。 问题是——

N 支球队参加了火星上的板球联赛,每支球队 一对截然不同的球队只互相比赛一次。因此,总共有 (N × (N1))/2 个匹配项。专家为每个团队分配了力量, 一个正整数。奇怪的是,火星人喜欢一边倒的比赛 一场比赛赚取的广告收入的绝对值是 两场比赛的实力差距。鉴于 N 个团队的实力,找出所有团队获得的总广告收入 比赛。

输入格式

第 1 行:单个整数 N。

第 2 行:N 个空格分隔的整数,N 个团队的实力。

#include<iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int stren[200000];
    for(int a=0;a<n;a++)
            cin>>stren[a];
    long long rev=0;
    for(int b=0;b<n;b++)
    {
            int pos=b;
            for(int c=pos;c<n;c++)
            {
                    if(stren[pos]>stren[c])
                        rev+=(long long)(stren[pos]-stren[c]);
                    else
                        rev+=(long long)(stren[c]-stren[pos]);
            }
    }
    cout<<rev;
}             

你能给我一个解决方案吗??

最佳答案

将循环重写为:

sort(stren);
for(int b=0;b<n;b++)
{
   rev += (2 * b - n + 1) * static_cast<long long>(stren[b]);
}

Live code here

它为什么有效
您的循环生成所有 2 对数字并将差值添加到 rev。所以在排序数组中,第 bth 项被减去 (n-1-b) 次并被加 b 次。因此数字 2 * b - n + 1


可以有 1 个可能不需要的微优化:

sort(stren);
for(int b = 0, m = 1 - n; b < n; b++, m += 2)
{
   rev += m * static_cast<long long>(stren[b]);
}

关于c++ - 如何减少以下代码在 C++ 中的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271880/

相关文章:

arrays - Julia 中的元素明智减法

javascript - JavaScript 中有字典实现吗?

mysql - 如何在 MySQL 中对非英文字符串进行排序?

c++ - 在每个应用程序的事件循环迭代中执行槽

c++ - 带有 COM 对象数组的 RAII

C++ 从两个类中确定 void* 的类型

java - while 循环中的多个条件给出不同的结果

c++ - Qt:自动生成power point报告或可编辑pdf报告

c - secret 敲击项目中确定的振幅

python - 属性错误 : 'list' object has no attribute 'sort_values'