[簡單思維題]小球
阿新 • • 發佈:2018-02-11
bsp clu style ... gpo http clas 簡單 代碼
定義小球i和小球j的距離為|(Ci−Cj)·(i−j)|,求所有小球之間距離的和。
題目描述
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; }
總結:多思考結果該如何計算得到。
[簡單思維題]小球