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;
}