题目描述
N个小球排成一列,第i个小球的颜色是Ci。
定义小球i和小球j的距离为|(Ci−Cj)·(i−j)|,求所有小球之间距离的和。
定义小球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; }
总结:多思考结果该如何计算得到。