题目链接

题意 : 给出一个排列,让你删除一个数,使得删除后整个序列的 Good 数数量最多。Good 数的定义为 若 Ai 为 Good 则存在 Aj < Ai ( j < i )

分析 : 

画画几个规律就能得出如下几个结论

① 若删除一个 Good 数,则原序列 Good 数的数量只会减一,即只会影响到这个 Good 数本身

这个也不难证明,若 Ai 是 Good 数,则存在  Aj < Ai ( j < i )

考虑当前有 Good 数 Ak 因删除 Ai 而变成非 Good 数,这个显然是不成立的

因为 Ai 是 Good 数的前提是存在 Aj 而 Aj 的存在就已经能够保证 Ak 是 Good 数了

故没有除了 Ai 以外的 Good 数因为 Ai 的删除被影响

② 如果一个数是非 Good 数,则这个数一定是从第一个数到这个数为止最小的数

③ 若删除的是一个非 Good 数,则去考虑有哪几个数因此被影响,即从 Good 变成 非 Good

删除一个非 Good 数那么影响到的只可能是其右边的数

那么考虑哪些数会因为这个数被删除就直接变成非 Good 数呢?

根据 ② 知道从头开始到这个非 Good 数,这个非 Good 数是最小的数

那么从这个非 Good 数开始向右延伸,如果右边的数是从头开始算起第二小的数

即它只比这个非 Good 数大的话,那么一旦删除这个非 Good 数,这个第二小的数必定变成非 Good

举个例子 1 4 3 2 这个排列,对于 4 其是从 1 开始算起第二小的数,如果 1 这个非 Good 数被删除

则 4 将变成非 Good ,而 3、2 同理,所以删除 1 必将影响 3 个数

那么到现在为止,算法就可以基本成型了

删除一个 Good 数原数列减少一个 Good 数

删除一个非 Good 我们可以预处理前缀最值和次大值来统计每个非 Good 的删除影响

最后选出代价最小且相同代价下最小的数即可

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define ULL unsigned long long
  4.  
  5. #define scs(i) scanf("%s", i)
  6. #define sci(i) scanf("%d", &i)
  7. #define scd(i) scanf("%lf", &i)
  8. #define scl(i) scanf("%lld", &i)
  9. #define scIl(i) scanf("%I64d", &i)
  10. #define scii(i, j) scanf("%d %d", &i, &j)
  11. #define scdd(i, j) scanf("%lf %lf", &i, &j)
  12. #define scll(i, j) scanf("%lld %lld", &i, &j)
  13. #define scIll(i, j) scanf("%I64d %I64d", &i, &j)
  14. #define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
  15. #define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
  16. #define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
  17. #define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
  18.  
  19. #define lson l, m, rt<<1
  20. #define rson m+1, r, rt<<1|1
  21. #define lowbit(i) (i & (-i))
  22. #define mem(i, j) memset(i, j, sizeof(i))
  23.  
  24. #define fir first
  25. #define sec second
  26. #define ins(i) insert(i)
  27. #define pb(i) push_back(i)
  28. #define pii pair<int, int>
  29. #define mk(i, j) make_pair(i, j)
  30. #define pll pair<long long, long long>
  31. using namespace std;
  32. ;
  33. const int INF = 0x3f3f3f3f;
  34. int Min1[maxn], Min2[maxn], arr[maxn], cnt[maxn];
  35. bool isGood[maxn];
  36. int n, nCase;
  37.  
  38. int main(void)
  39. {
  40. sci(nCase);
  41. while(nCase--){
  42.  
  43. mem(isGood, true);
  44.  
  45. sci(n);
  46. ; i<=n; i++) sci(arr[i]);
  47.  
  48. int MM1 = INF, MM2 = INF;
  49. ; i<=n; i++){
  50.  
  51. if(arr[i] < MM1){
  52. MM2 = MM1;
  53. MM1 = arr[i];
  54. }else if(arr[i] < MM2) MM2 = arr[i];
  55.  
  56. Min1[i] = MM1, Min2[i] = MM2;
  57.  
  58. if(arr[i] == MM1) isGood[i] = false;
  59. }
  60.  
  61. int idx;
  62. ; i<=n; i++){
  63. if(!isGood[i]){
  64. idx = i;
  65. cnt[i] = ;
  66. }else if(arr[i] == Min2[i]) cnt[idx]++;
  67. }
  68.  
  69. int ans = INF;
  70. ; i<=n; i++){///如果是非 Good 而且删除还没任何影响
  71. ){ ///则选出最小的这种数作为答案。
  72. ans = min(ans, arr[i]);
  73. }
  74. }
  75.  
  76. if(ans == INF){
  77. ; i<=n; i++){
  78. ) ans = min(ans, arr[i]);
  79. else if(isGood[i]) ans = min(ans, arr[i]);
  80. }
  81. }
  82.  
  83. printf("%d\n", ans);
  84. }
  85. ;
  86. }

2018山东省赛 E Sequence ( 思维 )的更多相关文章

  1. 2018山东省赛sequence

    2018山东省赛sequence因为必须要删除一个数,所以可以计算每个数删除的代价,从而选取代价最小的进行删除如果一个数大于它前面的所有数的最小值而小于次小值,删除最小值的代价就要+1:如果一个数本身 ...

  2. 2018山东省赛 H Dominoes ( 搜索 )

    题目链接 题意 : 给出一个 n * m 的矩阵,用规格 1 * 2 的多米诺去填充,题目数据保证最后只有一个格子是空白的(即没有被多米诺骨牌覆盖),问你现在通过移动多米诺能够产生多少种不同的状态(空 ...

  3. 2018山东省赛 G Game ( Nim博弈 && DP )

    题目链接 题意 : 给出 N 堆石子,每次可以选择一堆石子拿走任意颗石子,最后没有石子拿的人为败者.现在后手 Bob 可以在游戏开始前拿掉不超过 d 堆的整堆石子,现在问你有几种取走的组合使得 Bob ...

  4. 2018省赛赛第一次训练题解和ac代码

    第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title     A CodeForces 607A Chain Reaction     B CodeForces ...

  5. Triangle (第8届山东省赛的某题)

    triangle(第8届山东省赛的某题) 传送门 题意:喵了个呜,这题意真是峰回路转啊.懒死了,不想描述. 做法:我们拿set或线段树维护exp的最小值,每次取出exp值最小的边,删除之.并更新这条边 ...

  6. 2013年山东省赛F题 Mountain Subsequences

    2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...

  7. HEX SDUT 3896 17年山东省赛D题

    HEX SDUT 3896 17年山东省赛D题这个题是从矩形的左下角走到右上角的方案数的变形题,看来我对以前做过的题理解还不是太深,或者是忘了.对于这种题目,直接分析它的性质就完事了.从(1,1)走到 ...

  8. 2018天梯赛第一次训练题解和ac代码

    随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS     Memory Limit: ...

  9. 2018山东省ACM省赛G题-Game

    Alice and Bob are playing a stone game. There are n piles of stones. In each turn, a player can remo ...

随机推荐

  1. 【VS开发】【图像处理】GigE和USB3 vision选择?

    [VS开发][图像处理]GigE和USB3 vision选择? 具体得看你现场的应用吧,如 现场需要的工作距离,网线可达到100m以内,USB3.0一般般的5m以内: GigE双端都有卡扣,保证了与相 ...

  2. C语言I博客作业12-学期总结

    一.我学到的内容 二.我的收获 1. https://www.cnblogs.com/1076022899-lj/p/11576442.html 收获:第一次接触到C语言和PTA,第一次学习了博客园和 ...

  3. 【Linux 网络编程】常用套接字类型

    常用套接字类型<1>流式套接字(SOCK_STREAM)---TCP      提供面向连接的.可靠的传输服务,数据无差错,无重复的发送,      且按发送顺序接收.<2>数 ...

  4. 【Linux 网络编程】端口

    (1)众所周知的端口:0~1023,这些端口由IANA分配和控制它们紧密绑定用于一些服务.常用这些端口的通讯    明确表明了某些协议.例如:21端口为ftp服务端口. (2)注册端口:1024~49 ...

  5. [洛谷P4183][USACO18JAN]Cow at Large P

    题目链接 Bzoj崩了之后在洛谷偶然找到的点分好题! 在暴力的角度来说,如果我们$O(n)$枚举根节点,有没有办法在$O(n)$的时间内找到答案呢? 此时如果用树形$dp$的想法,发现是可做的,因为可 ...

  6. js知识点——2之navigator

    navigator(领航者) 1.appCodeName(返回浏览器的代码名) var x= navigator; document.write("CodeName:"+x.app ...

  7. python3抓取中国天气网不同城市7天、15天实时数据

    思路:1.根据city.txt文档来获取不同城市code2.获取中国天气网7d和15d不同城市url3.利用requests库请求url获取html内容4.利用beautifulsoup获取7d和15 ...

  8. homebrew学习(五)之homebrew cask和homebrew services

    homebrew cask 如果我想安装Chrome浏览器怎么办?试试下面的命令: brew install google-chrome 发现并不能安装,没有该软件.怎么办?好消息是一个叫做homeb ...

  9. 23、selenium爬取歌曲精彩评论

    我们这次试试用selenium爬取QQ音乐的歌曲评论,我选的歌是<甜甜的>.   https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html     f ...

  10. Echarts-数据的视觉映射

    来源:官网,自己整理 数据可视化是 数据 到 视觉元素 的映射过程(这个过程也可称为视觉编码,视觉元素也可称为视觉通道). ECharts 的每种图表本身就内置了这种映射过程,比如折线图把数据映射到『 ...