积木大赛:

  之前没有仔细地想,然后就直接暴力一点(骗点分),去扫每一高度,连到一起的个数,于是2组超时

先把暴力程序贴上来(可以当对拍机)

 #include<iostream>
#include<cstdio>
using namespace std;
FILE *fin = fopen("block.in","r");
FILE *fout= fopen("block.out","w");
int *h;
int n;
int maxHeight = -;
long long times = ;
int main(){
fscanf(fin,"%d",&n);
h = new int[(const int)(n + )];
for(int i = ;i <= n;i++){
fscanf(fin,"%d",&h[i]);
if(h[i] > maxHeight) maxHeight = h[i];
}
char isNew = 0x00;
for(int i = ;i <= maxHeight;i++){
isNew = 0x00;
for(int j = ;j <= n;j++){
if(h[j] >= i && isNew == ){
times++;
isNew = 0x01;
}
if(h[j] < i && isNew== 0x01){
isNew = 0x00;
}
}
}
fprintf(fout,"%ld",times);
}

  然而用样例来举个例子

       *
* *
* * * *
* * * * *
-----------------------------

  当第i列的目标高度比第(i-1)高的时候,很容易发现,需要多耗费(h[i]-h[i - 1])次操作,因为在操作使第(i-1)列达到目标高度时,第i列和目标高度还差

(h[i]-h[i - 1]),每次只能放一层的积木,所以需要多耗费(h[i]-h[i - 1])次操作。

  例如把第一层放满,其它层还需要的高度


           *
* * *
-----------------------------

  这样会很奇怪,为什么第5列还需要放一次呢?那是因为第一次方的区间是[1,5],每次求差相当于把这一块连续的这一块放上积木

从图中可以看出如果h[i] <= h[i - 1]则不用处理,于是我们可以得到如下递推式

       |- f[i - ] ( h[i] <= h[i - 1] )
f[i]=|
|- f[i - ] + ( h[i]-h[i - 1] ) ( h[i] > h[i - 1] )

最后,附上代码,说明长,代码不长:

 #include<iostream>
#include<fstream>
using namespace std;
ifstream fin("block.in");
ofstream fout("block.out");
int buffer[];
int n;
long long result = ;
int main(){
fin>>n;
for(int i = ;i <= n;i++){
fin>>buffer[];
if( buffer[] > buffer[] ) result += buffer[] - buffer[];
buffer[] = buffer[];
}
fout<<result;
return ;
}

积木大赛


花匠:

  这道题最开始用的是DP,虽然没有优化且明知复杂度是O(N2)但还是用它去骗骗分

 #include<iostream>
#include<cstdio>
using namespace std;
FILE *fin = fopen("flower.in","r");
FILE *fout= fopen("flower.out","w");
int *f;
int *f1;
int *h;
int n;
int main(){
fscanf(fin,"%d",&n);
f = new int[(const int)(n + )];
f1 = new int[(const int)(n + )];
h = new int[(const int)(n + )];
for(int i = ;i <= n;i++){
fscanf(fin,"%d",&h[i]);
f[i] = ;
f1[i] = ;
}
for(int i = ;i <= n; i++){
for(int j = i-;j > ;j--){
if(f[j]% == &&h[i]>h[j]){
f[i] = max( f[j] + ,f[i]);
}
if(f1[j]% == &&h[i]<h[j]){
f1[i] = max(f1[j] + ,f1[i]);
}
if(f[j]% == &&h[i]<h[j]){
f[i] = max(f[j] + ,f[i]);
}
if(f1[j]% == &&h[i]>h[j]){
f1[i] = max(f1[j] + ,f1[i]);
}
}
}
int maxv = -;
for(int i = ;i <= n;i++){
maxv = max(f[i],maxv);
maxv = max(f1[i],maxv);
}
fprintf(fout,"%ld",maxv);
return ;
}

  至于最简单、快捷的方法就是找拐点,一个拐点就是一个答案,至于依据嘛,画画图就能理解了

 #include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("flower.in");
ofstream fout("flower.out");
int n;
int *h;
int result = ;
void init(){
fin>>n;
h = new int[(const int)(n + )];
memset(h, ,sizeof(int)*(n + ));
for(int i = ;i <= n;i++){
fin>>h[i];
}
}
char aFlag = -;
int main(){
init();
for(int i = ;i < n; i++){
if(h[i] > h[i + ] && (aFlag == || aFlag == -) ){
result++;
aFlag = ;
}
if(h[i] < h[i + ] && (aFlag == || aFlag == -) ){
result++;
aFlag = ;
}
}
fout<<result;
return ;
}

花匠-找拐点

noip 2013 提高组 Day2 部分题解的更多相关文章

  1. NOIP 2013 提高组 day2 积木大赛

      积木大赛 描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第

  2. noip 2012 提高组 day2 部分题解

    这道题有多种解法,我用的是扩展欧几里得算法求到的答案 #include<iostream> #include<fstream> #include<cstdio> u ...

  3. NOIP 2015 提高组 Day2

    期望得分:100+10+60=170 实际得分:100+10+35=145 http://www.cogs.pro/cogs/page/page.php?aid=16 T1 跳石头 时间限制:1 s  ...

  4. NOIP 2013 提高组 day1 T2 火柴排队 归并 逆序对

    描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2∑i=1n(ai−bi) ...

  5. NOIP 2013提高组day 1 T 1转圈游戏 快速幂

    描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推 ...

  6. noip 2013 提高组 day1

    1.转圈游戏: 解析部分略,快速幂就可以过 Code: #include<iostream> #include<fstream> using namespace std; if ...

  7. NOIP 2014 提高组 Day2

    期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...

  8. NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)

    题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  9. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

随机推荐

  1. python面向对象高级:@property

    @property 把方法『变成』了属性,广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性. 最大的作用就是既能检查参数,又可以用类 ...

  2. CAP 一致性协议及应用解析

    https://mp.weixin.qq.com/s/26x8O1bRzurl84e3nM6TTA CAP 一致性协议及应用解析 原创: 有赞技术 有赞coder 1周前 文 | 云开 on 用户中心 ...

  3. How to make an HTTP request 异步 JavaScript 和 XML

    https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started In order to make an HTTP request to th ...

  4. window10 telnet的启用

    (1) window+R打开运行窗口,输入control,如图: (2) 点击类别改成大图标: 如图所示: 然后点击程序和功能. (3) 然后依次点击:启用或者关闭windows功能->teln ...

  5. 优云亮相GOPS2017全球运维大会 “黑科技”获全场最高关注

    2017年4月21日,GOPS――2017全球运维大会于深圳・圣淘沙酒店拉开帷幕.GOPS全球运维大会由高效运维社区(GreatOPS)和开放运维联盟(OOPSA)联合主办,由工信部信通院数据中心联盟 ...

  6. webpack初步了解

    webpack是一个打包工具,基于nodeJS Webpack 可以将多种静态资源 js.css.less 转换成一个静态文件,减少了页面的请求. 安装 Webpack 由于 npm 安装速度慢,本教 ...

  7. CentOS7.2配置vsftpd

    环境 CentOS7.2 (安装镜像CentOS-7-x86_64-DVD-1611) 本文默认使用root用户操作 目标 实现CentOS7.2上安装vsftpd,使用新创建的ftpuser用户便可 ...

  8. php 中date显示时间不对与Linux文件乱码问题

    php 中date显示时间不对解决办法如下1.修改/etc/php.ini文件 在里头中找到data.timezone =去掉它前面的分号';' 然后设置data.timezone = “Asia/S ...

  9. CentOS代理设置

    1.全局的代理设置: vi /etc/profile 添加下面内容 http_proxy = http://username:password@yourproxy:8080/ftp_proxy = h ...

  10. CDN工作过程(第二种版本)

    作者:代希刚链接:https://www.zhihu.com/question/36514327/answer/121026637来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...