思路 从网上拿的。。。
先输入N表示有N头牛,接下来的N个数是各个牛所在的位置。如果一头牛对另一头牛Moo,那么Moo数就是1号牛所在位置i与2号牛所在位置j的差值,又因为1号牛Moo过去,所以2号牛也要Moo回来,于是Moo数就变为2倍了。
1号牛要对剩余所有(N-1)头牛都Moo,如果我们将牛按顺序排好,每头牛i只对它身后的(N-i)头牛Moo,意思是,我们只考虑某头牛Moo出去的,而不考虑别的牛对它Moo回来的,那么它也不对在它前面的牛Moo,那么这就是一个简单的数学问题,每头牛i只对身后的(N-i)头牛Moo。因为所有牛还要Moo回去,所以最后结果乘2就可以了。
这就想到可以用循环来实现,对每头牛i,它与它后面(N-i)头牛j的距离(i-j),所有距离求和,就是Moo出去的次数,再乘2,就又加上了Moo回来的次数。这样答案就出来了。要用到二重循环。
当然要注意的还有数据范围,牛的个数在10,000以内,int就可以包括,而牛所在位置在0~1,000,000,000,显然Moo的次数也会很大,所以要用long long int才不会溢出。
View Code
1 #include<stdio.h> 2 #include<math.h> 3 long long int a[100010]; 4 void qsort(long long int a[],int l,int r) 5 { 6 long long int x=a[l],i=l,j=r; 7 if(l>=r) return; 8 while(i<j) 9 { 10 while(i<j&&a[j]>=x)j--; 11 a[i]=a[j]; 12 while(i<j&&a[i]<=x)i++; 13 a[j]=a[i]; 14 } 15 a[i]=x; 16 qsort(a,l,i-1); 17 qsort(a,i+1,r); 18 } 19 int main() 20 { 21 int n,i,j; 22 long long int sum=0; 23 scanf("%d",&n); 24 for(i=0;i<n;i++) 25 { 26 scanf("%lld",&a[i]); 27 } 28 qsort(a,0,n-1); 29 for(i=0;i<n-1;i++) 30 { 31 for(j=i+1;j<n;j++) 32 { 33 sum+=abs(a[i]-a[j]); 34 } 35 } 36 printf("%lld",sum*2); 37 return 0; 38 }