• [简单思维题]小球


    题目描述

    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
    ",ans);
        return 0;
    }

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

    转载请注明出处:https://www.cnblogs.com/lllxq/
  • 相关阅读:
    P2533 [AHOI2012]信号塔
    P1452 Beauty Contest
    P3194 [HNOI2008]水平可见直线
    P2924 [USACO08DEC]大栅栏Largest Fence
    P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
    P4208 [JSOI2008]最小生成树计数
    P4280 [AHOI2008]逆序对
    P3199 [HNOI2009]最小圈
    P3343 [ZJOI2015]地震后的幻想乡
    剪刀,石头,布,小游戏脚本
  • 原文地址:https://www.cnblogs.com/lllxq/p/8441081.html
Copyright © 2020-2023  润新知