关闭

[GarsiaWachs算法] BZOJ 3229 [Sdoi2008]石子合并 & POJ 1738 An old Stone Game & 51Nod 1023 石子归并 V3

412人阅读 评论(2) 收藏 举报
分类:

教主八题之一 却没有写堆或平衡树 投机取巧了 以后会把四边形不等式优化 和 数据结构维护都写一遍

详细解法见ACdreamers : http://blog.csdn.net/acdreamers/article/details/18043897

O(n2)的算法在这位神犇的实现下表现的十分优越 %%%


#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;

const int N=50005;  

int n,t,ans;
int stone[N];    
  
inline void combine(int k){  
  int tmp=stone[k]+stone[k-1];  
  ans+=tmp;  
  for(int i=k;i<t-1;i++)  
    stone[i]=stone[i+1];  
  t--;  
  int j=0;  
  for (j=k-1;j>0 && stone[j-1]<tmp;j--)  
    stone[j]=stone[j-1];  
  stone[j]=tmp;  
  while(j>=2 && stone[j]>=stone[j-2]){
    int d=t-j;  
    combine(j-1);  
    j=t-d;  
  }
}  
  
int main(){
  freopen("t.in","r",stdin);
  freopen("t.out","w",stdout);
  while (~scanf("%d",&n)){  
    if (!n) break;
    for (int i=0;i<n;i++) scanf("%d",stone+i);  
    t=1; ans=0;  
    for(int i=1;i<n;i++){
      stone[t++] = stone[i];  
      while (t>=3&&stone[t-3]<=stone[t-1])  
	combine(t-2);  
    }  
    while (t>1) combine(t-1);  
    printf("%d\n",ans);  
  }  
  return 0;  
}  


0
0
查看评论

51Nod-1023-石子归并 V3

ACM模版描述题解这个题的数据范围告诉我们无法通过 dpdp 来解决,但是可以通过贪心来解决,具体的贪心策略是一个叫做 GarsiaWachsGarsiaWachs 的算法。可以看看 fanhq666的博客,详细的讲述了这个算法,今天算是知道了一种新的算法,不过,感觉好鸡肋啊,并不知道这个算法除了这...
  • f_zyj
  • f_zyj
  • 2017-09-03 12:34
  • 170

石子归并

石子归并时间限制:1 s 内存限制:128 MB 设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆(每次合并花费的代价为当前两堆沙子的总数量),这样经过N-1次归并后成为一堆,归并...
  • still_foolish
  • still_foolish
  • 2016-11-22 12:12
  • 235

[其它-GarsiaWachs算法]51nod 1023 石子归并v3

1023 石子归并 V3 基准时间限制:2 秒 空间限制:131072 KB 分值: 640 难度:8级算法题 N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成...
  • reborn_ZhMZ
  • reborn_ZhMZ
  • 2016-04-12 12:55
  • 655

51 NOD 1023 石子归并 V3(GarsiaWachs算法)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1023 1023 石子归并 V3 基准时间限制:2 秒 空间限制:131072 KB 分值: ...
  • qq_34287501
  • qq_34287501
  • 2017-08-29 12:05
  • 165

GarsiaWachs算法的应用(POJ1738,51NOD1023)

先把两个题都贴出来看看吧 An old Stone Game Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 3383   Acc...
  • say_c_box
  • say_c_box
  • 2016-09-07 08:48
  • 555

男人八题其二(POJ 1738) 石子合并 GarsiaWachs算法

为公主殿下而战!
  • Kiritow
  • Kiritow
  • 2016-08-02 17:17
  • 457

石子合并(GarsiaWachs算法)

对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法。时间复杂度为O(n^2)。 它的步骤如下: 设序列是stone[],从左往右,找一个满足stone[k-1] stone[k+1]的k,找到后合并stone[k]和stone[k-1],再从当前位置开始向左找最大的j,使其满...
  • ACdreamers
  • ACdreamers
  • 2014-01-09 17:14
  • 6944

51nod 石子归并 (dp)

时限: 1000ms 内存限制:10000K  总时限:3000ms 描述: 在一个圆形操场的四周摆放着n堆石子(n 编一程序,读入石子堆数n及每堆的石子数( 比如有4堆石子:4 4 5 9 则最佳合并方案如下: 4 4 5 9 ...
  • h1021456873
  • h1021456873
  • 2015-10-24 12:38
  • 262

nyoj 石子归并(1)

石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述    有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的...
  • liusuangeng
  • liusuangeng
  • 2014-08-17 14:49
  • 550

石子归并(GarsiaWachs算法)

如果石子长度不长的话一般直接用dp来做,复杂度为O(n ^ 3),  但是有种叫(GarsiaWachs算法) 能把复杂度降到O(n ^ 2)甚至O(nlogn); 它的步骤如下: 设序列是stone[],从左往右,找一个满足stone[k-1] stone[k+1]的k,找到...
  • zjw6463
  • zjw6463
  • 2016-04-03 10:40
  • 372
    个人资料
    • 访问:366472次
    • 积分:13046
    • 等级:
    • 排名:第1237名
    • 原创:975篇
    • 转载:3篇
    • 译文:0篇
    • 评论:56条
    文章分类
    最新评论