zoukankan      html  css  js  c++  java
  • 【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)

    3229: [Sdoi2008]石子合并

    Description

      在一个操场上摆放着一排N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
      试设计一个算法,计算出将N堆石子合并成一堆的最小得分。

    Input

      第一行是一个数N。
      以下N行每行一个数A,表示石子数目。

    Output

      共一个数,即N堆石子合并成一堆的最小得分。

    Sample Input

    4
    1
    1
    1
    1

    Sample Output

    8

    HINT

    对于 100% 的数据,1≤N≤40000

    对于 100% 的数据,1≤A≤200

    Source

    【分析】

      额呵?奇怪的方法。。

      http://blog.csdn.net/Regina8023/article/details/45244733

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 #define Maxn 40010
     8 #define LL long long
     9 
    10 int a[Maxn];
    11 int n,nw;
    12 LL ans=0;
    13 
    14 void merge(int k)
    15 {
    16     int now=a[k-1]+a[k];
    17     ans+=now;
    18     for(int i=k;i<nw;i++) a[i]=a[i+1];
    19     nw--;
    20     int j;
    21     for(j=k-1;j>1&&a[j-1]<now;j--) a[j]=a[j-1];
    22     a[j]=now;
    23     while(j>=3&&a[j]>=a[j-2])
    24     {
    25         int d=nw-j;
    26         merge(j-1);
    27         j=nw-d;
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     scanf("%d",&n);
    34     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    35     nw=1;
    36     for(int i=2;i<=n;i++)
    37     {
    38         a[++nw]=a[i];
    39         while(nw>=3&&a[nw-2]<=a[nw])
    40          merge(nw-1);
    41     }
    42     while(nw>1) merge(nw);
    43     printf("%d
    ",ans);
    44     return 0;
    45 }
    View Code

    2017-02-28 21:00:08

  • 相关阅读:
    软件设计师-成绩查询
    spring data jpa
    Maven 项目中使用 logback
    spring boot 整合 Camunda
    Spring 中 bean 的生命周期?
    如何合理的使用工具提高效率?
    Java 中的日志
    HashMap 原理?jdk1.7 与 1.8区别
    内存泄漏与溢出
    v-on 绑定自定义事件
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6480877.html
Copyright © 2011-2022 走看看