2018山东省赛 E Sequence ( 思维 )
题意 : 给出一个排列,让你删除一个数,使得删除后整个序列的 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 的删除影响
最后选出代价最小且相同代价下最小的数即可
#include<bits/stdc++.h> #define LL long long #define ULL unsigned long long #define scs(i) scanf("%s", i) #define sci(i) scanf("%d", &i) #define scd(i) scanf("%lf", &i) #define scl(i) scanf("%lld", &i) #define scIl(i) scanf("%I64d", &i) #define scii(i, j) scanf("%d %d", &i, &j) #define scdd(i, j) scanf("%lf %lf", &i, &j) #define scll(i, j) scanf("%lld %lld", &i, &j) #define scIll(i, j) scanf("%I64d %I64d", &i, &j) #define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k) #define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k) #define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k) #define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k) #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 #define lowbit(i) (i & (-i)) #define mem(i, j) memset(i, j, sizeof(i)) #define fir first #define sec second #define ins(i) insert(i) #define pb(i) push_back(i) #define pii pair<int, int> #define mk(i, j) make_pair(i, j) #define pll pair<long long, long long> using namespace std; ; const int INF = 0x3f3f3f3f; int Min1[maxn], Min2[maxn], arr[maxn], cnt[maxn]; bool isGood[maxn]; int n, nCase; int main(void) { sci(nCase); while(nCase--){ mem(isGood, true); sci(n); ; i<=n; i++) sci(arr[i]); int MM1 = INF, MM2 = INF; ; i<=n; i++){ if(arr[i] < MM1){ MM2 = MM1; MM1 = arr[i]; }else if(arr[i] < MM2) MM2 = arr[i]; Min1[i] = MM1, Min2[i] = MM2; if(arr[i] == MM1) isGood[i] = false; } int idx; ; i<=n; i++){ if(!isGood[i]){ idx = i; cnt[i] = ; }else if(arr[i] == Min2[i]) cnt[idx]++; } int ans = INF; ; i<=n; i++){///如果是非 Good 而且删除还没任何影响 ){ ///则选出最小的这种数作为答案。 ans = min(ans, arr[i]); } } if(ans == INF){ ; i<=n; i++){ ) ans = min(ans, arr[i]); else if(isGood[i]) ans = min(ans, arr[i]); } } printf("%d\n", ans); } ; }
2018山东省赛 E Sequence ( 思维 )的更多相关文章
- 2018山东省赛sequence
2018山东省赛sequence因为必须要删除一个数,所以可以计算每个数删除的代价,从而选取代价最小的进行删除如果一个数大于它前面的所有数的最小值而小于次小值,删除最小值的代价就要+1:如果一个数本身 ...
- 2018山东省赛 H Dominoes ( 搜索 )
题目链接 题意 : 给出一个 n * m 的矩阵,用规格 1 * 2 的多米诺去填充,题目数据保证最后只有一个格子是空白的(即没有被多米诺骨牌覆盖),问你现在通过移动多米诺能够产生多少种不同的状态(空 ...
- 2018山东省赛 G Game ( Nim博弈 && DP )
题目链接 题意 : 给出 N 堆石子,每次可以选择一堆石子拿走任意颗石子,最后没有石子拿的人为败者.现在后手 Bob 可以在游戏开始前拿掉不超过 d 堆的整堆石子,现在问你有几种取走的组合使得 Bob ...
- 2018省赛赛第一次训练题解和ac代码
第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title A CodeForces 607A Chain Reaction B CodeForces ...
- Triangle (第8届山东省赛的某题)
triangle(第8届山东省赛的某题) 传送门 题意:喵了个呜,这题意真是峰回路转啊.懒死了,不想描述. 做法:我们拿set或线段树维护exp的最小值,每次取出exp值最小的边,删除之.并更新这条边 ...
- 2013年山东省赛F题 Mountain Subsequences
2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...
- HEX SDUT 3896 17年山东省赛D题
HEX SDUT 3896 17年山东省赛D题这个题是从矩形的左下角走到右上角的方案数的变形题,看来我对以前做过的题理解还不是太深,或者是忘了.对于这种题目,直接分析它的性质就完事了.从(1,1)走到 ...
- 2018天梯赛第一次训练题解和ac代码
随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS Memory Limit: ...
- 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 ...
随机推荐
- vue中,基于echarts 地图实现一个人才回流的大数据展示效果
0.引入echarts组件,和中国地图js import eCharts from 'echarts' import 'echarts/map/js/china.js'// 引入中国地图 1. 设置地 ...
- 完全卸载oracle11g步骤(不可行,直接用oracle自用删除就行)
完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->oracle - OraHome ...
- 为webService添加Interceptor(拦截器)
今天写一个简单的拦截器,以webService接口为例: 背景:H5的一个项目,只要调用H5webService 接口下面的方法都会触发一个AuthorityInterceptor去验证是否调用类型是 ...
- java按值传递?
原文链接:https://blog.csdn.net/scholar_man/article/details/80900212 在Java中,参数都是按值传递的.被传递到方法中的拷贝值,要不就是一个引 ...
- eclipse project--->clean作用
eclipse project-->clean ,clean主要是class文件删除,并同时编译新的工程,生成新的class文件. 如果修改代码后,在运行时,还是旧代码,可能class文件还是 ...
- JavaEE--JSP指令
JSP指令用于提供整个JSP页面的相关信息以及用于JSP页面与容器之间的通信.JSP指令有三种:page指令.include指令.taglib指令 1.page指令 用于设定整个JSP页面的属性和相关 ...
- orm的设计思路
一,我们先搞懂什么是orm? ORM:对象关系映射(Object Relational Mapping,简称ORM),目的是想像操作对象一样操作数据库.因为数据库不是面向对象的,所以需要编程进行映射. ...
- ELK-全文检索技术-lucene
ELK : ELK是ElasticSearch,LogStash以及Kibana三个产品的首字母缩写 一.倒排索引 学习elk,必须先掌握倒排索引思想, 参考文档: https://www.cn ...
- 2018.09.07 最新cocoapods安装流程
这篇写在简书了,就不费力气搬了,给简书留一篇. https://www.jianshu.com/p/13bbbf804b71
- python-scp-上传文件到服务器
python中使用scp,将文件上传到服务器 def ssh_scp_put(ip, username, password, local_file, remote_path): "" ...