更好的算法#34;锦标赛"

时间:2014-11-28 14:57:27

标签: c performance algorithm

我有一个问题。几天后我一直在为ZCO做准备,我遇到了一个非常简单的问题,我在3秒的时间限制内无法解决这个问题。这就是问题所在:

  

N队参加火星联赛板球比赛,每场比赛   一对不同的球队完全相互比赛。因此,有   总共(N×(N1))/ 2匹配。专家已经赋予了力量   每个团队,一个正整数。奇怪的是,火星人群喜欢   单场比赛和比赛赚取的广告收入是   两者的优势之间的差异的绝对值   火柴。鉴于N队的优势,找到总数   从所有比赛中获得的广告收入。

     

例如,假设N为4,团队优势为1,2,3,   4和3分别为3,10,3和5。然后是广告收入   从6场比赛如下:

     

7,0,2,7,5,2

     

因此,广告总收入为23。

     

样品输入4 3 10 3 5样品输出23测试数据在所有子任务中,   每个团队的实力是1到1,000之间的整数。

     

子任务1(30分):2≤N≤1,000   子任务2(70分):2≤N≤200,000。

     

限制

     

时间限制:3s

     

内存限制:64 MB

所以,我选择了一种简单的算法,可以扫描并找到每个团队的广告收入,与之前的所有其他团队相对应。这相当于 O(n ^ 2)无法通过子任务2.我不认为有可能改进这一点,任何人都可以帮助我吗?

P.S。虽然它没有帮助,但这是我目前的C代码:

#include <stdio.h>

int main(void)
{
    long long int n, i, j;
    scanf("%lld", &n);
    long long int A[n], strength = 0;
    for(i = 0;i < n;i++)
    {
        scanf("%lld", &A[i]);
        for(j = i;j >= 0;j--)
        {
            strength += A[i] > A[j] ? A[i] - A[j] : A[j] - A[i];
        }
    }
    printf("%lld\n", strength);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

假设我们有10个团队,称他们为A,B,C,......,J从最强到最弱。让我们来看看A和J之间的比赛。它有一个有趣的属性:来自该比赛的收入与其他两场比赛AB和BJ的收入总和相同。哦,还有AC和CJ。并且...哇,通过将AJ乘以9,我们将所有比赛的收入总和与A或J相加!现在我们只剩下8支球队。让我们来看看比赛B vs I.它有一个有趣的属性......数学不是很精彩吗?