zoukankan
html css js c++ java
P5569 【SDOI2008】 石子合并(黑科技)
#$Solution$ 当$n$在$100$左右时,直接$O(n^3)$区间$DP$ 当$n$在$40000$左右时,需要用贪心算法:**加西亚-瓦克斯算法**($Garsia Wachs$) 注:这个方法仅求石子合并的最小答案 这是大概的流程  这是关于$Garsia Wachs$算法的正确性证明:[传送门](https://blog.csdn.net/nameofcsdn/article/details/79682936) 时间复杂度最坏为$O(n^2)$,但是基本跑不满,数据随机的话$n=40000$能搞过去 代码使用链表实现,方便删除和插入操作,边界什么的比较麻烦,一定要注意,可以看看代码注释 #$Code$ ``` #include
#include
#include
#include
#define re register #define maxn 1000010 #define INF 0x3f3f3f3f #define ll long long using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ll ans,tmp; int l[maxn],r[maxn],v[maxn],n,a[maxn],cnt,num; int main() { n=read(); for(re int i=1;i<=n;++i) { a[i]=read(); v[i]=a[i],l[i]=i-1,r[i]=i+1; } v[0]=v[n+1]=INF;//赋为无穷大作为边界,保证所有删除插入都在边界内完成 r[0]=1,l[0]=-1;//这里要赋成-1,否则到了0,l[0]=0会一直死循环 l[n+1]=n,r[n+1]=0; cnt=n; num=n+1;//从n+2开始编号 while(cnt>1)//=1的时候跳出就行了 { cnt--; int now=0; while(r[r[now]]!=0)//不要写>=n+1,因为新的编号是>=n+1的,往右找是0就到了真是的边界,退出 { if(v[r[r[now]]]>=v[now]) break; now=r[now]; } tmp=v[now]+v[r[now]]; ans+=tmp;统计答案 r[l[now]]=r[r[now]]; l[r[r[now]]]=l[now];//删除操作,删除两个 now=l[now]; while(now>=0)//这里可以写>=0,往左是-1就代表到边界了 { if(v[now]>tmp) break; now=l[now]; } num++; l[num]=now,r[num]=r[now],v[num]=tmp; r[now]=num;//插入操作 l[r[num]]=num; } printf("%d ",ans); return 0; } ```
查看全文
相关阅读:
(C/C++学习笔记) 五. 常变量(只读变量)和宏
(C/C++学习笔记) 四. 运算符
(C/C++学习笔记) 三. 作用域和可见性
(C/C++学习笔记) 一. 基础知识
计算机科学的基本术语及其英语表达
模块与包
Python的递归
内置函数与匿名函数
装饰器,迭代器,生成器分析
命名关键字参数,函数对象,嵌套,名称空间与作用域,闭包
原文地址:https://www.cnblogs.com/Liuz8848/p/11723914.html
最新文章
html5拖放
html5 简介
xhtml的3種文檔聲明類型
xhtml和html的差別
xhtml 意義
XHTML 簡介
ajax readystatue
Ajax 響應
SQL-16 统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。
SQL-15 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
热门文章
SQL-14 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。 注意对于重复的emp_no进行忽略。
SQL-13 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
SQL-12 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
SQL-11 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示
SQL-10 获取所有非manager的员工emp_no
SAL-9 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'
SQL-8 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
SQL-7查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t (group 与count)
(C/C++学习笔记) 七. 类型转换
(C/C++学习笔记) 六. 表达式
Copyright © 2011-2022 走看看