zoukankan      html  css  js  c++  java
  • Codeforces Round #656 (Div. 3) C. Make It Good

    题目链接:https://codeforces.com/contest/1385/problem/C

    题意

    去除一个数组的最短前缀使得余下的数组每次从首或尾部取元素可以排为非减序。

    题解一

    当两个大数夹着一个小数那么第一个大数及其之前的数必须要去掉,比如 $1,1,2,1,2$,要去除的前缀长为 $3$,但是考虑到也会有 $1,1,2,1,1,2$ 的情况,所以可以将原数组去重后判断每三个相邻的元素。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n; cin >> n;
        int a[n] = {}; for (int i = 0; i < n; ++i) cin >> a[i];
        vector<pair<int, int>> v;
        for (int i = 0; i < n; ) {
            int j = i + 1;
            while (j < n and a[j] == a[i]) ++j;
            v.emplace_back(a[i], j - 1);
            i = j;
        }
        for (int i = v.size() - 1; i - 2 >= 0; --i) {
            if (v[i - 2].first > v[i - 1].first and v[i - 1].first < v[i].first) {
                cout << v[i - 2].second + 1 << "
    ";
                return;
            }
        }
        cout << 0 << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    题解二

    换言之,即找右端山脚为数组末尾元素的最长的山峰。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n; cin >> n;
        int a[n] = {}; for (auto &i : a) cin >> i;
        int p = n - 1;
        while (p - 1 >= 0 and a[p - 1] >= a[p]) --p;
        while (p - 1 >= 0 and a[p - 1] <= a[p]) --p;
        cout << p << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }
  • 相关阅读:
    winform 中xml简单的创建和读取
    睡眠和唤醒 进程管理
    [山东省选2011]mindist
    关于zkw流的一些感触
    [noip2011模拟赛]区间问题
    [某ACM比赛]bruteforce
    01、Android进阶Handler原理解析
    02、Java模式UML时序图
    04、Java模式 单例模式
    14、Flutter混合开发
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13334257.html
Copyright © 2011-2022 走看看