Codeforces 900C Remove Extra One 模拟

题目链接: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 }
原文地址:https://www.cnblogs.com/doggod/p/8331200.html