Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 1002  Solved: 535
[Submit][Status][Discuss]

Description

对于一个给定的序列a1, …,
an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列。这一操作的代价是max(ai,ai+1)。进行n-1次该操作后,可以得到一个长度为1的序列。我们的任务是计算代价最小的reduce操作步骤,将给定的序列变成长度为1的序列。

Input

第一行为一个整数n( 1 <= n <= 1,000,000 ),表示给定序列的长度。接下来的n行,每行一个整数ai(0 <=ai<= 1, 000, 000, 000),为序列中的元素。

Output

只有一行,为一个整数,即将序列变成一个元素的最小代价。

Sample Input

3
1
2
3

Sample Output

5

HINT

30%的测试数据 n<=500;
50%的测试数据 n <= 20,000。

思路

我可能写的比较(非常)麻烦;

我先排了个序,然后在原序列(链表存的)中从小到大开始操作,每次把一个数与它两边中较大一个合并;

代码实现

 #include<cstdio>
#include<algorithm>
const int maxn=1e6+;
inline int min_(int x,int y){return x<y?x:y;}
int n;
long long ans;
struct lili{int p,s,q;}s[maxn];
struct nate{int s,ip;}f[maxn];
bool comp(nate x,nate y){return x.s<y.s;}
int main(){
scanf("%d",&n);
s[].s=s[n+].s=1e9+;
for(int i=;i<=n;i++){
scanf("%d",&s[i].s);
s[i].p=i-,s[i].q=i+;
f[i].s=s[i].s,f[i].ip=i;
}
std::sort(f+,f+n+,comp);
int now,np,nq;
for(int i=;i<n;i++){
now=f[i].ip,np=s[now].p,nq=s[now].q;
ans+=min_(s[np].s,s[nq].s);
s[np].q=nq,s[nq].p=np;
}
printf("%lld\n",ans);
return ;
}

最新文章

  1. Xamarin Mono 环境搭建(使用Visual Studio 2013 开发android 和 ios )
  2. a[href$=&quot;.pdf&quot;]解释
  3. 基于SSL协议的双向认证 - 双向认证 [3]
  4. Hibernate day02笔记
  5. GDB调试器使用总结
  6. Git Fast-forward提交
  7. CSS 加载新方式
  8. hihocoder 1037 数字三角形
  9. github简单使用
  10. 三、Solr多核心及分词器(IK)配置
  11. Java内存回收(垃圾回收)机制总结
  12. SPL學習之SplDoublyLinkedList
  13. python实例编写(5)--异常处理,截图,用例设计
  14. LRUCache原理分析
  15. Mysql之数据类型(胖胖老师)
  16. ThinkPhp3.2.3 使用phpExcel导入数据
  17. Linux iptables防火墙
  18. QT 按钮的使用技巧
  19. ASP.NET MVC 实现有论坛功能的网站(有iis发布网站)
  20. MySQL连接数过多登录不上

热门文章

  1. servlet上传文件+上传进度显示
  2. 自定义 TypeHandler
  3. 如何查看安装的java是32位的,还是64位的
  4. 为sublime Text3 安装插件JS Format
  5. finger - 用户信息查找程序
  6. autoHeight.vue 高度自适应
  7. jquery--cookie应用
  8. atoi (String to Integer) leetcode
  9. vue 点击按钮弹窗,点击关闭按钮关闭弹窗。
  10. 去BAT,你应该要看一看的面试经验总结