zoukankan      html  css  js  c++  java
  • POJ 2231 Moo Volume

    思路 从网上拿的。。。

    先输入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 }
  • 相关阅读:
    js 简单getByClass得封装
    微信红包的随机算法
    js 淘宝评分
    HDU 1023 Train Problem II( 大数卡特兰 )
    HDU 1576 A/B( 逆元水 )
    HDU 5533 Dancing Stars on Me( 有趣的计算几何 )
    POJ 1664 放苹果( 递推关系 )
    HDU 2095 find your present (2)( 位运算 )
    POJ 3517 And Then There Was One( 约瑟夫环模板 )
    POJ 1988 Cube Stacking( 带权并查集 )*
  • 原文地址:https://www.cnblogs.com/timeship/p/2622262.html
Copyright © 2011-2022 走看看