[简单思维题]小球

题目描述

N个小球排成一列,第i个小球的颜色是Ci。
定义小球i和小球j的距离为|(Ci−Cj)·(i−j)|,求所有小球之间距离的和。

输入

第1行,1个整数N。第2行,N个整数C1,C2,...,CN。

输出

1个整数,表示所求的值。

样例输入

5
0 1 1 0 1

样例输出

11

提示

•对于60%的数据,N≤103
•对于100%的数据,1≤N≤105,0≤Ci≤1。

题目大意:略

思路:input是一串01串,所求为所有小球距离之和,这里你可以看作是算每个小球与其余剩下小球的距离之和(而且要除去重复算的),也可以看作是算每个小球(设第i个)与前i-1个小球的距离之和(这样不会重复算),同理也有看作算每个小球(设为i)与后n-i个小球的距离之和。

这里我们显然采取第二种做法会更加简单,因为这样可以采取边输入边处理的方式(详见代码),有利于后续处理。

总之,这样我们的总体思路就是:对于输入到的第i个数,若为1,则只需算其与之前的0的距离之和(每个1--0距离可以看作"当前1"至c1的距离减去0至c1的距离)(如图)

若为0,同理只需算其与之前的1的距离之和。

AC代码:

#include<cstdio>
#define ll long long
 
int main()
{
    int n;
    scanf("%d",&n);
    ll ans=0;
    ll num_0=0;
    ll num_1=0;
    ll sum_0=0;
    ll sum_1=0;
    for(int i=1;i<=n;i++){
        int tmp;
        scanf("%d",&tmp);
        if(tmp){
            ans+=(num_0*(i-1)-sum_0);
            num_1++;
            sum_1+=(i-1);
        }
        else{
            ans+=(num_1*(i-1)-sum_1);
            num_0++;
            sum_0+=(i-1);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

总结:多思考结果该如何计算得到。

 

posted @ 2018-02-11 12:59  l..q  阅读(249)  评论(0编辑  收藏  举报