NOIP2017赛前模拟(3):总结
题目:
1.购买板凳(100)
大意:区间修改最后查询全局最大值;
2.新排序(40分暴力)
大意:给一串长度小于100000的数列···每次操作找出序列中严格小于其左边的数字或者严格大于其右边的数字然后删除直到无法操作···最后要求输出最后的序列
3.豆豆游戏(5分dp······)
大意:类似与zuma游戏··给定一个长度小于200的01串··每次往串中插入0或者1构成连续3个相等数字的串的话就能消除····问最少插入多少个0或者1可以消除整个串···注意有连锁反应
题解:
1.差分
略
2.模拟
当然不是纯n方模拟···举个极端例子:50001,50002······100000,1,2,3,4······50000···直接模拟的话就是n方的复杂度··
考虑我们每次删除一对数···每次会影响的只有删除的数列的两端的数···比如上述例子一来我们会删除100000,1,那么受影响的只有99999,2因此我们直接将99999和2加入到另一个队列里面····下次直接考虑新建的队列即可·····
然而考试的时候直接打的n方暴力····其实如果我举出了上述例子还是比较容易想到正解的·····下次题做不出来多举例子试试··
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
const int inf=0x3f3f3f3f;
bool in[N],del[N];
int T,n,a[N],cnt;
struct node
{
int pos,val;
}b[N];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
int main()
{
//freopen("a.in","r",stdin);
T=R();
while(T--)
{
memset(del,false,sizeof(del));
memset(in,false,sizeof(in));
n=R();bool flag=false;cnt=;
for(int i=;i<=n;i++) a[i]=R();a[]=-inf,a[n+]=inf;
for(int i=;i<=n;i++) if(a[i]>a[i+]||a[i]<a[i-]) del[i]=true,flag=true;
for(int i=;i<=n;i++)
{
if(del[i])
{
if(i>&&!del[i-]&&!in[i-]) b[++cnt]=(node){i-,a[i-]},in[i-]=true;
if(i<n&&!del[i+]&&!in[i+]) b[++cnt]=(node){i+,a[i+]},in[i+]=true;
}
}
while(flag)
{
b[].val=-inf,b[cnt+].val=inf;
flag=false;int temp=;
for(int i=;i<=cnt;i++)
{
in[b[i].pos]=false;
if(b[i].val>b[i+].val||b[i].val<b[i-].val) del[b[i].pos]=true,flag=true;
}
for(int i=;i<=cnt;i++)
{
int p=b[i].pos;
if(del[p])
{
if(p>&&!del[p-]&&!in[p-]) b[++temp]=(node){p-,a[p-]},in[p-]=true;
if(p<n&&!del[p+]&&!in[p+]) b[++temp]=(node){p+,a[p+]},in[p+]=true;
}
else if(!in[p])
b[++temp]=b[i],in[p]=true;
}
cnt=temp;
}
int ans=;
for(int i=;i<=n;i++) if(!del[i]) ans++;
cout<<ans<<endl;
for(int i=;i<=n;i++) if(!del[i]) cout<<a[i]<<" ";
cout<<endl;
}
return ;
}
3.区间dp+分类讨论
md因为4种情况只想到3种直接挂到天上去····
先预处理出每一段的颜色以及数目··考虑f[i][j]表示消除ij段的最小代价···我们可以分成下面4种情况:
第一种:当i==j时:
f[i][i]=3-num[i]
其中num[i]为这i段的数目.
第二种:当col[i]!=col[j]时:
f[i][j]=f[i][k]+f[k+1][j]
其中i<=k<j,col[i]表示i段的颜色 .
第三种:当col[i]=col[j]时:
f[i][j]=min(f[i][j],f[i+1][j-1]+max(0,3-num[i]-num[j]))
第四种:当col[i]=col[j]时:
f[i][j]=min(f[i][j],f[i+1][k-1]+f[k+1][j-1])
其中col[i]=col[j]=col[k]且num[i]+num[j]<4且num[k]=1
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
const int inf=0x3f3f3f3f;
bool in[N],del[N];
int T,n,a[N],cnt;
struct node
{
int pos,val;
}b[N];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
int main()
{
//freopen("a.in","r",stdin);
T=R();
while(T--)
{
memset(del,false,sizeof(del));
memset(in,false,sizeof(in));
n=R();bool flag=false;cnt=;
for(int i=;i<=n;i++) a[i]=R();a[]=-inf,a[n+]=inf;
for(int i=;i<=n;i++) if(a[i]>a[i+]||a[i]<a[i-]) del[i]=true,flag=true;
for(int i=;i<=n;i++)
{
if(del[i])
{
if(i>&&!del[i-]&&!in[i-]) b[++cnt]=(node){i-,a[i-]},in[i-]=true;
if(i<n&&!del[i+]&&!in[i+]) b[++cnt]=(node){i+,a[i+]},in[i+]=true;
}
}
while(flag)
{
b[].val=-inf,b[cnt+].val=inf;
flag=false;int temp=;
for(int i=;i<=cnt;i++)
{
in[b[i].pos]=false;
if(b[i].val>b[i+].val||b[i].val<b[i-].val) del[b[i].pos]=true,flag=true;
}
for(int i=;i<=cnt;i++)
{
int p=b[i].pos;
if(del[p])
{
if(p>&&!del[p-]&&!in[p-]) b[++temp]=(node){p-,a[p-]},in[p-]=true;
if(p<n&&!del[p+]&&!in[p+]) b[++temp]=(node){p+,a[p+]},in[p+]=true;
}
else
b[++temp]=b[i],in[p]=true;
}
cnt=temp;
}
int ans=;
for(int i=;i<=n;i++) if(!del[i]) ans++;
cout<<ans<<endl;
for(int i=;i<=n;i++) if(!del[i]) cout<<a[i]<<" ";
cout<<endl;
}
return ;
}
NOIP2017赛前模拟(3):总结的更多相关文章
- NOIP2017赛前模拟11月6日—7日总结
收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次 ...
- NOIP2017赛前模拟11月4日总结:
第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...
- NOIP2017赛前模拟11月2日总结
分数爆炸的一天··但也学了很多 题目1:活动安排 给定n个活动的开始时间与结束时间··只有一个场地··要求保留尽量多的活动且时间不冲突···场地数n<=100000 考点:贪心 直接将结束时间按 ...
- NOIP2017赛前模拟10月30日总结
题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...
- NOIP2017赛前模拟(5):总结
题目: 1.刮刮卡 已知n(n<=1000000)张刮刮卡按顺序排列,刮开可以获得B元现金和B个积分,购买刮刮卡需要A元,某人若按照顺序刮开的话··当B的总和小于A时便会停止刮卡(即花出去的钱多 ...
- NOIP2017赛前模拟(4):总结
题目: 1.打牌 给定n个整数(n<=1000000),按照扑克牌对子(x,x)或者顺子(x,x+1,x+2)打出牌···问最多可以打出多少次对子或者顺子?牌的大小<=1000000 2. ...
- NOIP2017赛前模拟1:总结
题目: 1.造盒子 题目描述 企鹅豆豆收到了面积为 K 的一块橡皮泥.但是他没有合适的盒子来装下这个橡皮泥.所以他打算造一个盒子. 制造台是有方形网格的平台,每个小正方形边长为 1 .现在豆豆有两类木 ...
- NOIP2017年11月9日赛前模拟
最后一次NOIP模拟了····· 题目1:回文数字 Tom 最近在研究回文数字. 假设 s[i] 是长度为 i 的回文数个数(不含前导0),则对于给定的正整数 n 有:
- [NOIP2017]时间复杂度(模拟)
sscanf读入数字,getline(cin,string)读一整行,其余暴力模拟即可. #include<cstdio> #include<string> #include& ...
随机推荐
- HDU 4741 Save Labman No.004 (几何)
题意:求空间两线的最短距离和最短线的交点 题解: 线性代数和空间几何,主要是用叉积,点积,几何. 知道两个方向向量s1,s2,求叉积可以得出他们的公共垂直向量,然后公共垂直向量gamma和两线上的点形 ...
- PAT (Basic Level) Practise (中文)- 1012. 数字分类 (20)
http://www.patest.cn/contests/pat-b-practise/1012 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数 ...
- Bootstrap历练实例:带列表组的面板
带列表组的面板 我们可以在任何面板中包含列表组,通过在 <div> 元素中添加 .panel 和 .panel-default 类来创建面板,并在面板中添加列表组.您可以从 列表组 一章中 ...
- 【转】关于“using namespace std”
对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std.这句话其实就表示了所有的标准库函数都 ...
- Linux性能检测常用的10个基本命令
检测性能的10个命令汇总 uptim dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 ...
- dev gridview columns代码管理
进入run designer界面.我们将在代码中设置columns的属性. 类: ViewTriAtt : DevExpress.XtraEditors.XtraUserControl 在类里面设置g ...
- PHP实现同array_column一样的功能
不用PHP自带的array_column函数实现同样的功能 <?php /** * Created by PhpStorm. * User: 123456 * Date: 2018/9/25 * ...
- nginx下配置laravel+rewrite重写
server { listen ; server_name ha.d51v.cn; #access_log /data/wwwlogs/access_nginx.log combined; root ...
- cols
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 搭建本地虚拟服务器linux(CentOS 7)的python虚拟环境(Hyper-V演示)
新建虚拟机->安装CentOS7->新建虚拟交换机:内部网络->CentOS7设置->网络适配器:虚拟交换机:新建虚拟交换机->进入CentOS # cd /etc/sy ...