【数学】数字敏感度 + 组合

牛牛看云

https://ac.nowcoder.com/acm/contest/23106/H

数学 范围分析及组合

题目

alt

重述

思路

1.对范围的数字敏感度

我们发现,虽然n的范围比较大,但是a_i可选取范围较小。也就意味着,可能会出现多组重复计算的情况。

所以应对的情况就是,把所有的组合都算出来(1000*1000种可能,时间复杂度是可以接受的)

2.简化组合配对

如果仅仅考虑到上述情况并进行计算,最后的结果还是会超时。这里呢还有一个结论

python

m = list(map(int, input().split()))
a = [[0 for i in range(0, 1001)] for j in range(0, 1001)]
for i in range(0, 1001):
    for j in range(i, 1001):
        a[i][j] = abs(i + j - 1000)
        a[j][i] = abs(i + j - 1000)
s = 0
for i in range(0, n):
    for j in range(i, n):
        s = s + a[m[i]][m[j]]
print(s)

如图在配对阶段,仍然使用暴力的方法,最终是超时了的。所以在这里,我们还需要直接对重复出现的可能性进行直接的计算。

这里需要注意的一点是,虽然说我们的累加次序是从j= i - n, 但是由于他的两个算法都是加法,所以其实哪个在前哪个在后区别不是很大。因此,某个函数f(i, j)被使用到的概率,是 i 出现的次数 * j 出现的次数。

最后注意一下python输出....牛客要求输出整数...

题解

python

m = list(map(int, input().split()))
a = [[0 for i in range(0, 1001)] for j in range(0, 1001)]
b = [0 for i in range(0, 1001)]
for i in range(0, 1001):
    for j in range(i, 1001):
        a[i][j] = abs(i + j - 1000)
        a[j][i] = abs(i + j - 1000)
s = 0
for i in m:
    b[i] = b[i] + 1
for i in range(1001):
    for j in range(i, 1001):
        if i != j:
            s = s + a[i][j] * b[i] * b[j]
        else:
            s = s + (b[i]+1)*b[i]/2 * a[i][j]
print(int(s))

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务