Codeforces 900C Remove Extra One 模拟
题意:
首先record是指这个数比数列前面的所有数都大,给了n个数(1-n),删掉一个数,让整个数列的record值达到最大。
题解:
刚开始我的思路是求这个数列中前面比这个数大的有几个(因为只有前面只有一个数大于这个数的数可以增加record值)求出后找比求出个数为1的数大的最近数。后来发现这中方法代码量实在太大了,而且在求出后再求最近的大于这个数的数的复杂度也好像不够。
后来看了题解,发现只要换一种思路就很简单,那就是求删除某个位置上的数可以增加多少的record。只用设置两个数(最大值和次大值),在遍历时有数掉在这两个之间就让vec[max1]++(次小值改变);如果小于次小值这个数就肯定无法成为record值,如果大于最大值那么就改变最大值和次大值(注意这种情况,设置最大值的时候要在最大值-1,因为最大值被取掉后一定少了一个record)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX_N = 1e5+9; 4 int vec[MAX_N]; 5 int main() 6 { 7 int N; 8 while(cin>>N) 9 { 10 memset(vec,0,sizeof(vec)); 11 int mx = 0 , mx2 = 0; 12 for(int i=0;i<N;i++) 13 { 14 int x ; 15 scanf("%d",&x); 16 if(x > mx) 17 { 18 mx2 = mx; 19 mx = x; 20 vec[mx] --; 21 } 22 else if(x > mx2) 23 { 24 vec[mx] ++; 25 mx2 = x; 26 } 27 } 28 int maxn = -1; 29 int ans = 1; // ans = 1可以省去N=1时的特判 30 for(int i=1;i<=N;i++) 31 { 33 if(vec[i] > maxn) 34 { 35 maxn = vec[i]; 36 ans = i; 37 } 38 } 39 cout<<ans<<endl; 40 } 41 }