码迷,mamicode.com
首页 > 其他好文 > 详细

[简单思维题]小球

时间:2018-02-11 14:37:53      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:pre   can   def   简单   表示   alt   scanf   整数   而且   

题目描述

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;
}

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

 

[简单思维题]小球

标签:pre   can   def   简单   表示   alt   scanf   整数   而且   

原文地址:https://www.cnblogs.com/lllxq/p/8441081.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!