zoukankan      html  css  js  c++  java
  • Artem and Array CodeForces

    大意: 给定序列$a$, 每次任选$a_i$删除, 得分$min(a_{i-1},a_{i+1})$(无前驱后继时不得分), 求最大得分.

    若一个数$x$的两边都比$x$大直接将$x$删除, 最后剩余一个先增后减的序列, 然后按从大到小顺序删除

    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <cstdio>
    #include <vector>
    #include <string.h>
    #include <queue>
    #define PER(i,a,n) for(int i=n;i>=a;--i)
    #define REP(i,a,n) for(int i=a;i<=n;++i)
    
    using namespace std;
    const int N = 2e6+10; int a[N], b[N], f[N], n, m, k; int q[N]; int main() { scanf("%d", &n); REP(i,1,n) scanf("%d", a+i); ll ans = 0; REP(i,1,n) { while (*q>1&&q[*q]<=a[i]&&q[*q]<=q[*q-1]) { ans += min(q[--*q], a[i]); } q[++*q] = a[i]; } sort(q+1,q+1+*q); REP(i,1,*q-2) ans += q[i]; printf("%I64d ", ans); }
  • 相关阅读:
    单例模式的八种写法
    反射
    工厂模式
    Java内存分配、管理小结
    Java 反射(二)
    Java反射
    servlet的web-xml配置详解
    substr和substring的区别
    C/C++中extern关键字详解
    lua总则
  • 原文地址:https://www.cnblogs.com/uid001/p/10658837.html
Copyright © 2011-2022 走看看