牛牛看云C++

1 篇文章 0 订阅

这题意思就是文中的那个公式

 这个公式相当于

如果知道这个的话,很多人可能都试过直接暴力,然后就出现了时间超限,然后就不知所措了。

我们先不管绝对值和1000时候

想想a=1 2 3 4的情况:

(1+1)+ (1+2)+ (1+3)+ (1+4)

(2+2)+ (2+3)+ (2+4)

(3+3)+ (3+4)

(4+4)

再想想a=1 1 1 1时的情况:

(1+1)+(1+1)+(1+1)+(1+1)

(1+1)+(1+1)+(1+1)

(1+1)+(1+1)

(1+1)

再a=1 1 1 1中,1 出现的次数为  4次

4*4+4 = 20;

20 / 2 = 10;

我们再去想想a=1 2 3 4时怎么得出的,就理解了

下面就是代码

#include "bits/stdc++.h"
using namespace std;
const int N = 1e6+5;
int s[N];
int zhi[1005];
int main(){
    int n;
    long long ans = 0;
    cin>>n;
    for(int i = 1;i<=n;i++){
        cin>>s[i];
        zhi[s[i]]++;//记录每个数出现的次数
        ans += abs((long long)s[i]*2-1000);//自己+自己也要记录一下,直接存到结果ans里面
    }
    //把0-1000全部的数枚举下
    for(int i = 0;i<=1000;i++){
        for(int j = 0;j<=1000;j++){
            ans += (long long)zhi[i]*zhi[j]*abs(i+j-1000);//数之间匹配的结果之和
        }
    }
    cout<<ans/2<<endl;//我们都是算了是双倍的,所以需要除2
}

以上想法是我赛后,看了大佬的代码,理解下后获得的想法,然后补题并且写下思路来提高自己,然后补知识点遗忘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值