zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    洛谷P4113 [HEOI2012]采花
    洛谷P5159 WD与矩阵
    洛谷P1262 间谍网络
    洛谷P3038 牧草种植Grass Planting
    洛谷P3258 [JLOI2014]松鼠的新家
    洛谷P2294 [HNOI2005]狡猾的商人
    洛谷P4878 [USACO05DEC]layout布局
    【CF1132F】Clear the String (DP)
    [AH2017/HNOI2017]大佬(动态规划 搜索)
    「NOI2018」屠龙勇士(CRT)
  • 原文地址:https://www.cnblogs.com/doggod/p/8331200.html
Copyright © 2011-2022 走看看