3288积木大赛

正文

题目描述

春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。

在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1。

小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入输出格式

输入格式:

输入文件为 block.in

输入包含两行,第一行包含一个整数n,表示大厦的宽度。

第二行包含n个整数,第i个整数为hi 。

输出格式:

输出文件为 block.out

仅一行,即建造所需的最少操作数。

输入输出样例

输入样例#1:

5
2 3 4 1 2
输出样例#1:

5

说明

【样例解释】

其中一种可行的最佳方案,依次选择

[1,5] [1,3] [2,3] [3,3] [5,5]

【数据范围】

对于 30%的数据,有1 ≤ n ≤ 10;

对于 70%的数据,有1 ≤ n ≤ 1000;

对于 100%的数据,有1 ≤ n ≤ 100000,0 ≤ hi≤ 10000。

做法:

该题有两种较简单的解法:

①:二分+递归

②:贪心

/*
① 利用二分法从积木底下开始模拟
找到整个数组当中最小的积木高度 记为smal 然后减掉smal高度 然后ans=ans+smal
用递归从该最小积木处 继续左右搜索找到smal 依次类推......
*/
#include<iostream>
using namespace std;
int f(int x,int y);
int a[];
int main()
{
int n,ans=;
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
ans=f(,n);
cout<<ans;
return ;
}
int f(int x,int y)
{
if(x>y) return ;
int smal=;
int m=-;
for(int i=x;i<=y;i++)
{
if(a[i]<smal)
{
smal=a[i];
m=i;
}
}
for(int i=x;i<=y;i++) a[i]-=smal;
return (smal+f(x,m-)+f(m+,y));
}

二分

/*
② 用贪心从积木左边开始模拟
最高的记为m 每次ans+=hi-m(计算次数) 直到找到hi<m
这时用hi替换m 从这里继续搜
*/
代码如下:
#include<iostream>
using namespace std;
int a[];
int main()
{
int n,m=,ans=;
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++)
{
if(a[i]>m)
{
ans+=a[i]-m;
m=a[i];
}
else if(a[i]<m) m=a[i];
}
cout<<ans;
return ;
}

贪心

3289 花匠

2013年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。
具体而言,栋栋的花的高度可以看成一列整数h_1, h_2, … , h_n。设当一部分花被移走后,剩下的花的高度依次为g_1, g_2, … , g_m,则栋栋希望下面两个条件中至少有一个满足:
条件 A:对于所有的1<i<m/2,g_2i > g_2i-1,且g_2i > g_2i+1; 
条件 B:对于所有的1<i<m/2,g_2i < g_2i-1,且g_2i < g_2i+1。
注意上面两个条件在m = 1时同时满足,当m > 1时最多有一个能满足。
请问,栋栋最多能将多少株花留在原地。

输入描述 Input Description

输入的第一行包含一个整数 n,表示开始时花的株数。
第二行包含 n 个整数,依次为h_1, h_2,… , h_n,表示每株花的高度。

输出描述 Output Description

输出一行,包含一个整数 m,表示最多能留在原地的花的株数。

样例输入 Sample Input


5 3 2 1 2

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

对于 20%的数据,n ≤ 10; 
对于 30%的数据,n ≤ 25; 
对于 70%的数据,n ≤ 1000,0 ≤ h_i ≤ 1000; 
对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤ h_i ≤ 1,000,000,所有的h_i随机生成,所有随机数服从某区间内的均匀分布。

/*O(n)的贪心*/
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 100010
int n,a[maxn],b[maxn],cnt,ans;
int main(){
freopen("FlowerNOIP2013.in","r",stdin);
freopen("FlowerNOIP2013.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]!=b[cnt]||i==)
b[++cnt]=a[i];
}
for(int i=;i<cnt;i++)
if((b[i]<b[i-]&&b[i]<b[i+])||(b[i]>b[i-]&&b[i]>b[i+]))
ans++;
printf("%d",ans+);
}

3290 华容道

2013年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次。于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间。
小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的:

  1. 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的;
  2. 有些棋子是固定的,有些棋子则是可以移动的;
  3. 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白格子上。 游戏的目的是把某个指定位置可以活动的棋子移动到目标位置。

给定一个棋盘,游戏可以玩 q 次,当然,每次棋盘上固定的格子是不会变的,但是棋盘上空白的格子的初始位置、指定的可移动的棋子的初始位置和目标位置却可能不同。第 i 次玩的时候,空白的格子在第 EX_i 行第 EY_i 列,指定的可移动棋子的初始位置为第 SX_i 行第 SY_i 列,目标位置为第 TX_i 行第 TY_i 列。
假设小 B 每秒钟能进行一次移动棋子的操作,而其他操作的时间都可以忽略不计。请你告诉小 B 每一次游戏所需要的最少时间,或者告诉他不可能完成游戏。

输入描述 Input Description

第一行有 3 个整数,每两个整数之间用一个空格隔开,依次表示 n、m 和 q;
接下来的 n 行描述一个 n*m 的棋盘,每行有 m 个整数,每两个整数之间用一个空格隔开,每个整数描述棋盘上一个格子的状态,0 表示该格子上的棋子是固定的,1 表示该格子上的棋子可以移动或者该格子是空白的。
接下来的 q 行,每行包含 6 个整数依次是 EX_i、EY_i、SX_i、SY_i、TX_i、TY_i,每两个整数之间用一个空格隔开,表示每次游戏空白格子的位置,指定棋子的初始位置和目标位置。

输出描述 Output Description

输出有 q 行,每行包含 1 个整数,表示每次游戏所需要的最少时间,如果某次游戏无法完成目标则输出-1。

样例输入 Sample Input

3 4 2 
0 1 1 1 
0 1 1 0 
0 1 0 0 
3 2 1 2 2 2 
1 2 2 2 3 2

样例输出 Sample Output


-1

数据范围及提示 Data Size & Hint

【样例说明】
棋盘上划叉的格子是固定的,红色格子是目标位置,圆圈表示棋子,其中绿色圆圈表示目标棋子。
第一次游戏,空白格子的初始位置是 (3, 2)(图中空白所示),游戏的目标是将初始位置在(1, 2)上的棋子(图中绿色圆圈所代表的棋子)移动到目标位置(2, 2)(图中红色的格子)上。
移动过程如下:

第二次游戏,空白格子的初始位置是(1, 2)(图中空白所示),游戏的目标是将初始位置在(2, 2)上的棋子(图中绿色圆圈所示)移动到目标位置 (3, 2)上。

要将指定块移入目标位置,必须先将空白块移入目标位置,空白块要移动到目标位置,必然是从位置(2,2)上与当前图中目标位置上的棋子交换位置,之后能与空白块交换位置的只有当前图中目标位置上的那个棋子,因此目标棋子永远无法走到它的目标位置,游戏无法完成。

【数据范围】
对于 30%的数据,1 ≤ n, m ≤ 10,q = 1; 
对于 60%的数据,1 ≤ n, m ≤ 30,q ≤ 10; 
对于 100%的数据,1 ≤ n, m ≤ 30,q ≤ 500。

/*
记录棋盘状态时只需记录空格的位置和目标棋子的位置
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,q,sx,sy,ex,ey,tx,ty,ans;
int map[][];
bool vis[][][][];
struct node{
int x0,y0,step,x1,y1;
}cur,nxt;
int e[][]={{,},{,-},{-,},{,}};
void bfs(){
queue<node>q;
q.push(cur);
while(!q.empty()){
cur=q.front();q.pop();
if(cur.x1==tx&&cur.y1==ty){
ans=cur.step;
return;
}
for(int i=;i<;i++){
int xx=cur.x0+e[i][],yy=cur.y0+e[i][];
if(xx<=n&&xx>=&&yy<=m&&yy>=&&map[xx][yy]){
nxt.x0=xx,nxt.y0=yy;
nxt.x1=cur.x1,nxt.y1=cur.y1;
if(xx==cur.x1&&yy==cur.y1)//说明是空白格和目标格交换位置,更新目标格目前的位置
nxt.x1=cur.x0,nxt.y1=cur.y0;
nxt.step=cur.step+;
if(nxt.x1==tx&&nxt.y1==ty){
ans=nxt.step;
return;
}
if(!vis[nxt.x0][nxt.y0][nxt.x1][nxt.y1]){
vis[nxt.x0][nxt.y0][nxt.x1][nxt.y1]=;
q.push(nxt);
}
}
}
}
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d",&map[i][j]);
map[i][j];
}
while(q--){
ans=-;
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
map[ex][ey]=;
memset(vis,,sizeof(vis));
vis[ex][ey][sx][sy]=;
cur.x0=ex,cur.y0=ey;
cur.x1=sx,cur.y1=sy;
cur.step=;
bfs();
printf("%d\n",ans);
}
}

80分 普通宽搜

2013 Noip提高组 Day2的更多相关文章

  1. 一道搜索题【2013 noip提高组 DAY2 t3】华容道

    这篇不多说,具体的解释都在程序里 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果 ...

  2. 2013 Noip提高组 Day1

    3285 转圈游戏 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description ...

  3. 2015 Noip提高组 Day2

    P2678 跳石头 [题目背景] 一年一度的“跳石头”比赛又要开始了! [题目描述] 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和 ...

  4. 2014 Noip提高组 Day2

    P2038 无线网络发射器选址 [题目描述] 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 ...

  5. 2012 Noip提高组 Day2

    1265. [NOIP2012] 同余方程 ★☆   输入文件:mod.in   输出文件:mod.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 求关于 x 的同余方 ...

  6. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  7. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  8. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  9. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

随机推荐

  1. EasyRTMP实现RTMP异步直播推送之环形缓冲区设计

    本文转自EasyDarwin团队kim的博客:http://blog.csdn.net/jinlong0603 EasyRTMP的推送缓冲区设计 EasyRTMP内部也同样采用的环形缓冲的设计方法,将 ...

  2. linux环境下远程访问ftp

    sftp ftpuser@127.0.0.1 使用sftp命令 ftpuser是用户名 127.0.0.1是目标ip 亲测好使.

  3. AbstractFactory Pattern

    AbstractFactory模式用来解决这类问题:要创建一组相关或者相互依赖的对象. AbstractFactory Pattern结构图 实现: #ifndef _PRODUCT_H_ #defi ...

  4. 自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...

  5. 存储过程系列四: decode函数使用学习

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  6. 通过Chrome浏览器进行android调试/Remote Debugging on Android with Chrome

    The way your web content behaves on mobile can be dramatically different from the desktop experience ...

  7. 浏览器端JS导出EXCEL

    浏览器端JS导出EXCEL FileSaver.js 实现了在本身不支持 HTML5 W3C saveAs() FileSaver 接口的浏览器支持文件保存.FileSaver.js 在客户端保存文件 ...

  8. BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量

    BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...

  9. [LeetCode] Longest Valid Parentheses -- 挂动态规划羊头卖stack的狗肉

    (Version 1.3) 这题在LeetCode上的标签比较有欺骗性,虽然标签写着有DP,但是实际上根本不需要使用动态规划,相反的,使用动态规划反而会在LeetCode OJ上面超时.这题正确的做法 ...

  10. [ZJOI 2012] 网络

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2816 [算法] 对每种颜色的边建一棵LCT , 维护联通性即可 时间复杂度 : O( ...