题目:

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):总结的更多相关文章

  1. NOIP2017赛前模拟11月6日—7日总结

    收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次 ...

  2. NOIP2017赛前模拟11月4日总结:

    第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...

  3. NOIP2017赛前模拟11月2日总结

    分数爆炸的一天··但也学了很多 题目1:活动安排 给定n个活动的开始时间与结束时间··只有一个场地··要求保留尽量多的活动且时间不冲突···场地数n<=100000 考点:贪心 直接将结束时间按 ...

  4. NOIP2017赛前模拟10月30日总结

    题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...

  5. NOIP2017赛前模拟(5):总结

    题目: 1.刮刮卡 已知n(n<=1000000)张刮刮卡按顺序排列,刮开可以获得B元现金和B个积分,购买刮刮卡需要A元,某人若按照顺序刮开的话··当B的总和小于A时便会停止刮卡(即花出去的钱多 ...

  6. NOIP2017赛前模拟(4):总结

    题目: 1.打牌 给定n个整数(n<=1000000),按照扑克牌对子(x,x)或者顺子(x,x+1,x+2)打出牌···问最多可以打出多少次对子或者顺子?牌的大小<=1000000 2. ...

  7. NOIP2017赛前模拟1:总结

    题目: 1.造盒子 题目描述 企鹅豆豆收到了面积为 K 的一块橡皮泥.但是他没有合适的盒子来装下这个橡皮泥.所以他打算造一个盒子. 制造台是有方形网格的平台,每个小正方形边长为 1 .现在豆豆有两类木 ...

  8. NOIP2017年11月9日赛前模拟

    最后一次NOIP模拟了····· 题目1:回文数字 Tom 最近在研究回文数字. 假设 s[i] 是长度为 i 的回文数个数(不含前导0),则对于给定的正整数 n 有:

  9. [NOIP2017]时间复杂度(模拟)

    sscanf读入数字,getline(cin,string)读一整行,其余暴力模拟即可. #include<cstdio> #include<string> #include& ...

随机推荐

  1. 在linux命令行下如何访问网址

    1. wget Ubuntu系统自带,会将访问的首页下载到本地 admin@iZj6c9c6vaqj1i0a9j7h78Z:~$ wget www.baidu.com --2019-04-20 17: ...

  2. 2018.4.22 深入理解Java的接口和抽象类

    前言 对于面向对象编程来说,抽象是他的一大特征之一.在Java中,可以通过两种形式来体现oop 的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初雪的时候会以为他们可以随意互 ...

  3. NPM下载模块包说明

    博主对npm包安装收集了各种资料和实践后对它们之间的差异整理,写下这篇文章避免自己忘记,同时也给node.js猿友一点指引. 我们在使用 npm install 安装模块的模块的时候 ,一般会使用下面 ...

  4. java基础—抽象类介绍

    一.抽象类介绍

  5. python @staticmethod和@classmethod

    Python其实有3个方法,即 静态方法 (staticmethod), 类方法 (classmethod)和 实例方法. 如下: def foo(x): print "executing ...

  6. C++ 学习笔记(四)类的内存分配及this指针

    类,是使用C++的最主要的内容.如果将c++与C语言做比较,我感觉类更像是结构体的加强进化版.在刚接触C++不久的时候总是让类,对象,this指针弄得一脸懵逼,我对类有比较清楚的认识是从理解类在内存中 ...

  7. 【Java_Spring】RestTemplate发HTTP请求详解

    Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Spring RestTemplate提交时设置http header请求头 Spring之RestTempla ...

  8. java中的jdbc操作

    package demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSta ...

  9. IDEA常用快捷键(不全)

    这里使用的是默认的idea快捷键,如果修改了keymap为其他,那么不适用. 1.格式化代码:Ctrl+Alt+L(可能与QQ的冲突,建议QQ只保留方便的截图,皮) 2.在当前行最后添加分号,或自动补 ...

  10. ZOJ 2314 (sgu 194) Reactor Cooling (无源汇有上下界最大流)

    题意: 给定n个点和m条边, 每条边有流量上下限[b,c], 求是否存在一种流动方法使得每条边流量在范围内, 而且每个点的流入 = 流出 分析: 无源汇有上下界最大流模板, 记录每个点流的 in 和 ...