1. 程式人生 > >[簡單思維題]小球

[簡單思維題]小球

bsp clu style ... gpo http clas 簡單 代碼

題目描述

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

總結:多思考結果該如何計算得到。

[簡單思維題]小球