This question already has answers here:

Finding sum of Absolute Difference of Every pair of integer from an array
(7个答案)
我有个问题几天来我一直在为ZCO做准备,我遇到了一个很简单的问题,我在3秒的时间内无法解决问题来了:
n支球队在火星参加板球联赛
两个不同的队只打一次。因此,有
总共(n×(n­)个匹配项/2个。一位专家给
每队,一个正整数。奇怪的是,火星人喜欢
单面比赛的广告收入是
两者强度之差的绝对值
比赛。考虑到N个团队的优势,找出
所有比赛的广告收入。
例如,假设n是4,团队1、2、3的团队优势,
和4分别是3、10、3和5。那么广告收入
从6场比赛来看:
7,0,2,7,5,2
因此,广告总收入为23。
所有子任务中的样本输入4 3 10 3 5样本输出23测试数据,
每队的实力是1到1000之间的整数。
子任务1(30分):2≤n≤1000。
子任务2(70分):2≤N≤200000
限制
时限: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;
}

最佳答案

假设我们有10支队伍,从最强到最弱分别称为A、B、C、…、J让我们看看A和J之间的匹配。它有一个有趣的特性:来自该匹配的收入与来自AB和BJ两个其他匹配的收入之和相同哦,还有AC和CJ。还有…哇,把A J乘以9,我们就得到了所有A或J的比赛的总收入现在我们只剩下8支队伍了让我们看看比赛B对I。它有一个有趣的特性数学不是很好吗?

关于c - 一种更好的“比赛”算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27191284/

10-13 09:22