这是2018与2013提高组的真题,可怕,,原题出了两年,是个纯模拟。

读完题后就想写一个朴素的模拟,先遍历层数,再把达到层数的宽度#存起来,再判断是否连续,如果不连续ans++,然后每一次循环都要初始化,所以第一次提交得了80pts,TLE了最后两个点。然后再去看题解,竟然发现:当i+1组数据大于i组数据,ans+=h[i+1]-h[i],因为只要小于就是前面的最大的操作数,然后因为不连续所以即使大于前面的但小于前面最大ans也需要++。

1.思路清晰,对时间复杂度进行计算,10^5for来for去再加memset一般就超时了

2.模拟题还是需要找找性质,找到最优的解题方法,简单的题要追求满分

代码1(80‘):

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 10000005
using namespace std;
int n;
int h[N],biuld[N];
int max_h=-;;
int ans=;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&h[i]);
max_h=max(h[i],max_h);
}
for(int i=;i<=max_h;i++){
int cnt=;
memset(biuld,,sizeof(n+));
for(int j=;j<=n;j++){
if(h[j]>=i){//假如还需要加高度
biuld[++cnt]=j;//存储第几个
//cout<<biuld[cnt]<<endl;
}
}
// cout<<endl;
ans++;
for(int i=;i<=cnt-;i++){//判断需要几次操作
if(biuld[i+]-biuld[i]>=){//假如不是相邻的
ans++;
}
}
}
cout<<ans; return ;
}

代码2(100’):

 #include<iostream>
#include<cstdio>
using namespace std;
int n,ans=;
int h[];
int main(){
cin>>n;
h[]=;
for(int i=;i<=n;i++){
cin>>h[i];
if(h[i]>h[i-]){//假如后面的比前面的要小
ans+=h[i]-h[i-];
}
}
cout<<ans; return ;
}

最新文章

  1. 精通 CSS 选择器
  2. git 代码组织
  3. 《JAVA与模式》之适配器模式(转)
  4. Java面向对象深度
  5. Fedora 14配置vsftp服务步骤
  6. extends 与 implements 的区别
  7. 如何设置MySQL Workbench EER Diagram 尺寸?
  8. 用数组实现栈demo
  9. 手动向IIS注册.net框架组件
  10. Android 虚拟机快捷键
  11. ExtJS003单击按钮弹出window
  12. elk工作原理
  13. #1094 : Lost in the City by C solution
  14. JavaScript树(一) 简介
  15. Where Can I Download Full Installers for WebLogic Server
  16. 主席树——树链上第k大spoj COT
  17. React(六)Props属性
  18. 关于http与https的注意点
  19. 全文居中及DIV居中
  20. postgresql修改配置生效方法

热门文章

  1. Python 3标准库课件
  2. C#Regex中replace方法的替换自定义小数点后的内容
  3. 对url给后台传数据的时候特殊字符需要转义
  4. 16.合并两个排序的链表(python)
  5. linux-ntp-10
  6. jquery odd选择器 语法
  7. Luogu P3408 恋爱
  8. C++ 打印XPS文档
  9. Android事件分发详解(六)——ACTION_DOWN的消费验证
  10. JMS学习十(ActiveMQ支持的传输协议)