E.Sequence

原题链接
https://ac.nowcoder.com/acm/contest/123/E

思路
题意是给出一个序列和好数的定义,所谓好数就是对于一个数a[i],存在一个a[j](j < i),使得a[i] > a[j],就是在它前面如果有比它小的数,那它就是好数。那么对于一个序列,可以设置一个第一小的数first,一个第二小的数second,以及一个数组cnt,表示的是删除这个数会减少多少好数,那么可以分几种情况讨论:
1.当前的数小于first,那么删掉当点的数不会对好数的数量产生影响,但是要更新first和second
2.当前的数大于first,那么就说明当前的数是一个好数,删除他自己会减少一个好数,所以cnt[a[i]] ++ ,如果这个数小于second,那么删除first就会使得它不再是好数,所以cnt[first] ++ ,并且second更新为a[i]。

代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000010;

int cnt[N];
int a[N];

int main() {
    int t;
    scanf("%d", &t);
    while (t -- ) {
        memset(cnt, 0, sizeof cnt);
        
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
        
        int x = 1e9, y = 1e9;  // first和second
        for (int i = 1; i <= n; i ++ ) {
            if (a[i] > x) {
                cnt[a[i]] ++ ;
                if (a[i] < y) {
                    cnt[x] ++ ;
                    y = a[i];
                }
            }
            if (a[i] < x) {
                y = x;
                x = a[i];
            }
        }
        
        int min_ = 1e9, ans = 1e9;
        for (int i = 1; i <= n; i ++ ) {  // 找出影响最小的一个数删除
            if (cnt[a[i]] < min_) {
                min_ = cnt[a[i]];
                ans = a[i];
            }
            else if (cnt[a[i]] == min_) ans = min(ans, a[i]);
        }
        
        printf("%d\n", ans);
    }
    
    return 0;
}
posted on 2021-05-07 16:33  Laurance  阅读(48)  评论(0编辑  收藏  举报