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

    题意:

    给定n个数字。

    问随意两数之间的差的总和是多少。


    思路:

    先从小到大排序。

    然后dp转移方程:

    sum[i]=sum[i-1] + i*(sum[i]-sum[i-1]);

    最后结果是ans=sum[n]*2;(由于噪声计算是双向的)

    事实上与其说是dp,还不如说是找规律。

    这种时间复杂度是sort的时间复杂度O(nlogn)。

    主要卡精度。

    。。

    法一:

    #include<stdio.h>
    #include<stdlib.h>
    #define MAX_COW  10050
    long long  sum[MAX_COW],cow[MAX_COW],ans=0;
    int cmp(const void *a,const void *b)
    {return  *(long long  *)a-*(long long *)b;}
    int main()
    {
      int i,n;
      sum[0]=0;
      while(scanf("%d",&n)!=EOF)
      { 
        for(i=0;i<n;i++)
         scanf("%lld",&cow[i]);
         qsort(cow,n,sizeof(cow[0]),cmp);
         for(i=1;i<n;i++)
          {
            sum[i]=sum[i-1]+(cow[i]-cow[i-1])*i;
            ans+=sum[i];
          }
          printf("%lld
    ",ans*2);
      }
       return 0; 
    }
    
    法二:
    #include<stdio.h>
    #include<stdlib.h>
    #define MAX_COW  10050
    __int64  sum[MAX_COW],cow[MAX_COW],ans=0;
    int cmp(const void *a,const void *b)
    {return  *(__int64 *)a-*(__int64 *)b;}
    int main()
    {
      int i,n;
      sum[0]=0;
      while(scanf("%d",&n)!=EOF)
      { 
        for(i=0;i<n;i++)
         scanf("%I64d",&cow[i]);
         qsort(cow,n,sizeof(cow[0]),cmp);
         for(i=1;i<n;i++)
          {
            sum[i]=sum[i-1]+(cow[i]-cow[i-1])*i;
            ans+=sum[i];
          }
          printf("%I64d
    ",ans*2);
      }
       return 0; 
    }
    

  • 相关阅读:
    adb命令
    linux常用命令(2)
    Cisco路由器配置基本命令
    linux常用命令
    跨站脚本攻击xss
    选择合适的索引列顺序
    索引的选择性
    mysql索引类型(按存储结构划分)
    mysql数据类型优化
    vim基本命令总结
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6739732.html
Copyright © 2011-2022 走看看