DAY2

T1积木大赛

传送门

题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有

它应有的高度。

题解:O(n)扫一遍就好了。后一个比前一个的高度低,那么前一个已经把它覆盖了,

如果高那么就需要+1了。

代码:

#include<iostream>
#include<cstdio>
#define maxn 100009
using namespace std; int n,x,pre,ans; void read(int &x){
char ch=getchar();int f=;x=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x*=f;
} int main(){
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
read(n);
for(int i=;i<=n;i++){
read(x);
if(x>pre)ans=ans+x-pre;
pre=x;
}
printf("%d\n",ans);
fclose(stdin);fclose(stdout);
return ;
}

AC

T2花匠

传送门

题目大意:求最长波动子序列

题解:贪心

暴力dp[i][1/0][1/0]表示到第i个数作为波峰(1)或波谷(0)选(1)还是不选(0)的最长长度

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100008
using namespace std; int n,h[maxn],dp[maxn][][]; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} int main(){
read(n);
for(int i=;i<=n;i++)read(h[i]);
dp[][][]=dp[][][]=;
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
if(h[i]>h[j])dp[i][][]=max(dp[i][][],dp[j][][]+);
if(h[i]<h[j])dp[i][][]=max(dp[i][][],dp[j][][]+);
dp[i][][]=dp[i][][]=max(max(dp[j][][],dp[j][][]),max(dp[j][][],dp[j][][]));
}
}
printf("%d\n",max(max(dp[n][][],dp[n][][]),max(dp[n][][],dp[n][][])));
return ;
}

70

这不跟昨天湖南的题一样么。

对于 5 4 3 2 9

5 2 9,4 2 9,3 2 9,好像没什么区别。那么连续递减的5 4 3 2就可以看成一个数了。

以一个数为大的和小的分别扫一遍就好。

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100008
using namespace std; int ans,ret,cur,flag,n,h[maxn]; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} int main(){
freopen("flower.in","r",stdin);
freopen("flower.out","w",stdout);
read(n);
for(int i=;i<=n;i++)read(h[i]);
cur=h[];ans=;
for(int i=;i<=n;i++){
if(flag){
if(h[i]<cur)flag=,ans++,cur=h[i];
else cur=max(cur,h[i]);
}else{
if(h[i]>cur)flag=,ans++,cur=h[i];
else cur=min(cur,h[i]);
}
}
cur=h[];ret=;flag=;
for(int i=;i<=n;i++){
if(flag){
if(h[i]>cur)flag=,ret++,cur=h[i];
else cur=min(cur,h[i]);
}else{
if(h[i]<cur)flag=,ret++,cur=h[i];
else cur=max(cur,h[i]);
}
}
ans=max(ans,ret);
printf("%d\n",ans);
fclose(stdin);fclose(stdout);
return ;
}

AC

一个多月前我做的...似乎是看了就是看了题解...

#include<iostream>
#include<cstdio>
using namespace std;
int n,pre,now,r=,d=;
int main()
{
scanf("%d",&n);
scanf("%d",&pre);//当前这盆花前面那盆花的高度,初始为第一盆花的高度。
for(int i=;i<n;i++)
{
scanf("%d",&now);
if(now>pre)r=max(r,d+);//当前这盆花高度大于前面那盆花高度
if(now<pre)d=max(d,r+);//说明现在是上升序列,就要求出到Now这个花盆且波动为
pre=now; //上升的最优解,就从原来求出的最后波动为上升的最优解,
} //(也就是说此时当前这盆花不加入之前最优解,移走)
printf("%d",max(r,d));//和从最后波动为下降的最优解+1选取最优值(不移走)。
return ;
}

AC

T3华容道

传送门

题目大意:一个n*m的矩阵,有n*m-1个棋子。1表示该棋子能移动,0表示不能。

给出指定位置和目标位置。求最少几步能利用空白格子将指定位置棋子移到目标位置。

题解:

dfs 5分...怀疑人生

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 100000000
using namespace std; int n,m,q,x,cnt,ans;
int ex,ey,sx,sy,tx,ty;
int t[][],tmp[][],vis[][];
int mx[]={,,-,},
my[]={-,,,}; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} void dfs(int ex,int ey,int sx,int sy,int tx,int ty,int prex,int prey,int ste){
if(ex==tx&&ey==ty&&abs(sx-ex)+abs(sy-ey)<=){
ans=min(ans,ste+);
return;
}
for(int i=;i<;i++){
int xx=ex+mx[i],yy=ey+my[i];
if(xx>=&&xx<=n&&yy>=&&yy<=m&&t[xx][yy]&&(xx!=prex||yy!=prey)&&!vis[xx][yy]){
vis[xx][yy]=true;
if(xx==sx&&yy==sy){
dfs(xx,yy,ex,ey,tx,ty,ex,ey,ste+);
}else dfs(xx,yy,sx,sy,tx,ty,ex,ey,ste+);
}
}
} int main(){
// freopen("puzzle.in","r",stdin);
// freopen("puzzle.out","w",stdout);
read(n);read(m);read(q);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
read(t[i][j]);
for(int i=;i<=q;i++){
cnt=;ans=inf;
memset(vis,,sizeof(vis));
read(ex);read(ey);//空白格子
vis[ex][ey]=true;
read(sx);read(sy);//指定棋子
read(tx);read(ty);//目标位置
if(sx==tx&&sy==ty){
printf("0\n");
continue;
}
dfs(ex,ey,sx,sy,tx,ty,,,);
if(ans==inf)printf("-1\n");
else printf("%d\n",ans);
}
// fclose(stdin);fclose(stdout);
return ;
}

5

bfs 70 其实考试时开始写的bfs。发现不会记录状态。

看了题解算来只需要记录空白格子和指定棋子的位置就好了。

时间复杂度O(q*(nm)^2)

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std; int ans,n,m,qx,tx,ty;
int t[][],vis[][][][];
int mx[]={,,,-},
my[]={-,,,};
struct Node{
int ex,ey,sx,sy,ste;
}now;
queue<Node>q; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} void BFS(){
memset(vis,,sizeof(vis));
Node tmp,cur;
vis[now.sx][now.sy][now.ex][now.ey]=true;
while(!q.empty())q.pop();q.push(now);
while(!q.empty()){
cur=q.front();q.pop();
if(cur.sx==tx&&cur.sy==ty){
ans=cur.ste;
return;
}
for(int i=;i<;i++){
tmp=cur;
int xx=tmp.ex+mx[i],yy=tmp.ey+my[i];
if(!t[xx][yy]||xx<||xx>n||yy<||yy>m)continue;
if(xx==tmp.sx&&yy==tmp.sy)tmp.sx=tmp.ex,tmp.sy=tmp.ey;
tmp.ex=xx;tmp.ey=yy;tmp.ste=cur.ste+;
if(!vis[tmp.sx][tmp.sy][tmp.ex][tmp.ey]){
vis[tmp.sx][tmp.sy][tmp.ex][tmp.ey]=true;
q.push(tmp);
}
}
}
} int main(){
read(n);read(m);read(qx);
for(int i=;i<=n;i++) for(int j=;j<=m;j++) read(t[i][j]);
for(;qx;qx--){
read(now.ex);read(now.ey);read(now.sx);read(now.sy);read(tx);read(ty);
now.ste=;ans=n*m;
BFS();
if(ans!=n*m)printf("%d\n",ans);
else printf("-1\n");
}
return ;
}

70

正解..搜索+最短路。傻逼错误毁我青春...从下午写到现在...

我还是单独开个随笔讲这个题吧。邪王真眼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 5000
#define inf 2147483647 int n,m,qx,sumedge,ans,ex,ey,sx,sy,tx,ty,p;
int map[][],pre_dis[][],head[maxn],vis[maxn],dis[maxn];
int mx[]={-,,,},
my[]={,,,-};
struct Node{
int x,y;
}cur,nxt;
queue<Node>q;
queue<int>qn; struct Edge{
int x,y,z,nxt;
Edge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}edge[maxn]; void add(int x,int y,int z){
edge[++sumedge]=Edge(x,y,z,head[x]);
head[x]=sumedge;
} int get_id(int i,int j){
return (i-)*m*+(j-)*;
} void bfs(int ex,int ey,int sx,int sy,int d){
memset(pre_dis,-,sizeof(pre_dis));
pre_dis[ex][ey]=;pre_dis[sx][sy]=;
Node now,nxt;now.x=ex;now.y=ey;
while(!q.empty())q.pop();
q.push(now);
while(!q.empty()){
now=q.front();q.pop();
int x=now.x,y=now.y;
for(int i=;i<;i++){
int xx=x+mx[i],yy=y+my[i];
if(xx<||xx>n||yy<||yy>m||!map[xx][yy]||pre_dis[xx][yy]!=-)continue;
pre_dis[xx][yy]=pre_dis[x][y]+;
nxt.x=xx;nxt.y=yy;
q.push(nxt);
}
}
if(d==)return;
int id=get_id(sx,sy);
for(int i=;i<;i++)
if(pre_dis[sx+mx[i]][sy+my[i]]>)
add(id+d,id+i,pre_dis[sx+mx[i]][sy+my[i]]);
add(id+d,get_id(ex,ey)+(d+)%,);
} void spfa(int sx,int sy){
memset(dis,-,sizeof(dis));
memset(vis,,sizeof(vis));
while(!qn.empty())qn.pop();
int id=get_id(sx,sy);
for(int i=;i<;i++)
if(pre_dis[sx+mx[i]][sy+my[i]]!=-){
dis[id+i]=pre_dis[sx+mx[i]][sy+my[i]];
qn.push(id+i);
}
while(!qn.empty()){
int cur=qn.front();qn.pop();vis[cur]=false;
for(int i=head[cur];i;i=edge[i].nxt){
int v=edge[i].y;
if(dis[v]>dis[cur]+edge[i].z||dis[v]==-){
dis[v]=dis[cur]+edge[i].z;
if(!vis[v]){
vis[v]=true;
qn.push(v);
}
}
}
}
} int main(){
scanf("%d%d%d",&n,&m,&qx);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&map[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(map[i][j]){
if(map[i-][j])bfs(i-,j,i,j,);
if(map[i][j+])bfs(i,j+,i,j,);
if(map[i+][j])bfs(i+,j,i,j,);
if(map[i][j-])bfs(i,j-,i,j,);
}
for(int i=;i<=qx;i++){
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
if(sx==tx&&sy==ty){
printf("0\n");
continue;
}
bfs(ex,ey,sx,sy,);
ans=inf;
spfa(sx,sy);
int id=get_id(tx,ty);
for(int j=;j<;j++)
if(dis[id+j]!=-)ans=min(ans,dis[id+j]);
if(ans==inf) ans=-;
printf("%d\n",ans);
}
return ;
}

AC

NOIP2013 DAY2题解的更多相关文章

  1. 二模Day2题解

    小明搬家 题目描述 小明要搬家了,大家都来帮忙. 小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼. 最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了.最后大家发现这样混乱地搬运过程效率太 ...

  2. 【NOIP2012】DAY1+DAY2题解

    不贴代码的原因是我的代码在初中机房.忘记带过来了. DAY 1 T1随便搞,但是字符串相关的题我经常犯蠢 T2 一个结论题,OAO但是需要高精度写. 具体就是按左手的数除右手的数(还是怎么的来着)排个 ...

  3. [NOIP2013]华容道 题解(搜索)

    [NOIP2013]华容道 [题目描述] 这道题根据小时候玩华容道不靠谱的经验还以为是并查集,果断扑街.考后想想也是,数据这么小一定有他的道理. 首先由于是最小步数,所以BFS没跑了.那么我们大可把这 ...

  4. [NOIP2013]华容道 题解

    [NOIP2013]华容道 首先是一种比较显然的做法. 整个棋盘,除了起点,终点和空格,其他的方块是等价的. 对于终点,它始终不会变化,如果搜到终点结束搜索即可,所以我们不需要考虑终点. 所以需要考虑 ...

  5. CCF统一省选 Day2 题解

    此题解是教练给我的作业,AK了本场比赛的人,以及认为题目简单的人可以不必看 T1 算法一 暴力枚举对信号站顺序的不同排列,然后对代价取\(\min\)即可. 时间复杂度\(O(m! \cdot n)\ ...

  6. 【NOIP2014】DAY2题解+代码

    T1 傻逼题……不想写贴昨年代码了. 总之随便怎么搞都能过. 15年的DAY2T1怎么那么毒瘤真是越活越倒退] #include <iostream> #include <fstre ...

  7. NOIP[2015] Day2题解

    问题 A: 跳石头 时间限制: 1 Sec  内存限制: 128 MB 题目描述 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石. ...

  8. 【2018暑假集训模拟一】Day2题解

    T1 园艺工人的求助 [题目描述]终于,在一段繁忙的训练之后,到了NOIP 的举办的时候.同学们坐上了大巴车,享受着沿途的风光,讨论着未解决的问题,憧憬着NOIP 赛场上切题的样子.很快,大巴车到了大 ...

  9. NOIP2013 Day2

    1.积木大赛 https://www.luogu.org/problemnew/show/1969 这道题在考试时暴力得比较麻烦,导致只得了80分,t了两个点. 思路为寻找一个区间内高度大于0的最低点 ...

随机推荐

  1. iptables配置顺序-两条规则会忽略后边的

    oracle在centos本机能够正常访问,关闭防火墙也能够远程访问,但是一旦开启防火墙则不能远程访问 尝试添加规则iptables -A INPUT -m state --state NEW -m ...

  2. Samba 3.6.9 安装、管理

    Samba简介 Samba服务类似于windows上的共享功能,可以实现linux上共享文件,windows上访问,当然在linux上可以访问到.是一种在局域网上共享文件和打印机的一种通信协议,它为局 ...

  3. Nginx进阶-不停服更新

    前言 7*24小时不间断的提供对外服务和产品快速迭代是互联网行业的特征,基于需求所有的发布都不能停止当前对外的服务.本文围绕此话题衍生出,不停服上下线工具实现. 看本文前请先看 Nginx初识 Ten ...

  4. 插入算法分别从C,java,python三种语言进行书写

    真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”. 作为一个初级编程人员或者说是一个 ...

  5. 20145222黄亚奇《网络对抗》 逆向及BOF进阶实践学习总结

    20145222<网络对抗> 逆向及BOF进阶实践学习总结 实践目的 1.注入shellcode 2.实现Return-to-libc攻击 知识点学习总结 Shellcode实际是一段代码 ...

  6. Python引用多个模块,调用模块中的函数时,要注意的地方

    转自:http://blog.csdn.net/yjk13703623757/article/details/70237463 python模块是”从下到上”导入(import)的. 例如: a.py ...

  7. 深入理解JVM 垃圾收集器(下)G1收集器

    1.回顾CMS 1.1堆内存结构 1.2新生代GC 1.3老年代GC 2.G1收集器 2.1G1实现概览及使用场景 G1的推荐使用场景 2.2GC 2.2.1新生代GC 2.2.2老年代GC 老年代G ...

  8. spring security结合数据库验证用户-注解方式

    项目目录结构如下: 首先数据库的建立和数据导入,以及一些类的依赖参考XML配置方式,需要修改一些配置. 一.在AppConfig文件中添加DataSource的配置 @Bean(name = &quo ...

  9. java中HashMap集合的常用方法

    public Object clone() 返回hashMap集合的副本 其余的方法都是实现Map集合的 https://www.cnblogs.com/xiaostudy/p/9510763.htm ...

  10. PAT1036. Boys vs Girls (25)

    #include <iostream> #include <algorithm> #include <vector> using namespace std; st ...