题目链接详见SCNU 2015新生网络赛 1006. 3D打印 。出题思路来自codevs 3288. 积木大赛,属于模拟题。
 
      首先我们把“选择从第L部分到第R部分”理解为“选择一段连续的部分”,OK,基本题意为:给定N个部件的高度,每次可以给连续的一段增加高度$1$,问至少需要几次增加高度的操作?
 
      不少人认为,直接模拟这个操作,循环给它$+1$,数加几次能达到要求高度就可以了。但很可惜这是会超时TLE哒。我们考虑极端情况,总共有$10^{5}$个部分,高度$h_{i}$是$0$和$10^{5}$相间的,这样总共需要$\frac {10^{5}} {2} \times 10^{5} = 5 \times 10^{9}$次操作,复杂度为$O(NH)$,也就是说很可能一些同学的做法,会要进行$5 \times 10^{9}$次的循环,运行结果同样也是$5 \times 10^{9}$,不但超时,而且还超了$int$整型的范围。当然良心出题人并没有把这组数据放进去,数据做了奇怪的限定能保证结果不超过$int$,否则你应该需要拿long long__int64来存放结果(32位机下$int$和$long$都是$4$字节,一样的范围)。
 
      那怎么办呢?我们可以发现,如果$h_{i} > h_{i-1}$,那么总操作次数应要加上$h_{i} - h_{i-1}$,因为假定我在到达前面高度为$h_{i-1}$的部分的时候,已经总共操作了$t_{1}$次,如果当前部分比前面的还高,那么这个部分的下面$h_{i-1}$的高度已经被前面的操作完成了(尽量选择连续的一段增加高度),于是这里我只剩下了$t_{2} = h_{i} - h_{i-1}$的高度未完成。如果$h_{i} \leq h_{i-1}$,则前面的操作肯定也把这部分顺便完成了,因此不需要再次计算。由于每次只需要比较$h_{i}$和$h_{i-1}$的大小关系,前面比较过的与后面的无关,所以只需要一个循环把数组遍历一次就可以了,复杂度为$O(N)$。
 
      代码如下(我是在读入的时候就完成判断,因此不需要数组保存了):
 #include <stdio.h>

 int main() {
int T, N;
scanf("%d", &T);
while(T--) {
int t = , x;
long long res = ;
scanf("%d", &N);
for(int i=; i<N; i++) {
scanf("%d", &x);
if(x>t) res += x-t;
t = x;
}
printf("%I64d\n", res);
}
return ;
}
 
      在提交的代码中发现有同学想到了另一种方法,即寻找极大极小值的做法,复杂度同样为$O(N)$。比如我先找到一个极小值$rmin$,往后面找到一个极大值$rmax$,这样总次数只需加上$rmax - rmin$即可,因为极小值前面的部分已经计算过了,只需要考虑极小值到极大值之间的操作次数就好了。当然一开始时极小值为$0$,遍历结束后也要注意加上还没计算的部分,略微麻烦点,留给大家思考。
 
      附:数据生成程序如下:
 #include <stdio.h>
#include <random>
using namespace std;
default_random_engine g1;
default_random_engine g2;
lognormal_distribution<double> lognDis(, );
uniform_int_distribution<int> uiDis(, 1E5); int main() {
freopen("in.txt", "w+", stdout);
int T = ;
printf("%d\n", T);
while(T--) {
int N = lognDis(g1);
if(N>1E5) N%=int(1E5);
printf("%d\n", N);
for(int i=; i<N; i++) {
int Hi = uiDis(g2);
printf("%d ", Hi);
}
puts("");
}
return ;
}

Click To

 

SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告的更多相关文章

  1. SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告

            题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 .         其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来( ...

  2. SCNU 2015ACM新生赛初赛【1001~1011】个人解题思路

            题目1001:       大意:已知$n$个角色,$m$种怪物种族,$k$个怪物,给出一组角色编号,编号$P_{i}$的角色能肝死编号$i$的怪物,对于给定的一组怪物编号,为了打通关 ...

  3. SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告

            题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音?       ...

  4. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  5. 2013级新生程序设计基础竞赛-正式赛 F 异或最大值 解题报告

    F - 异或最大值 Time Limit: 2000/1000MS (Java/Others)      Memory Limit: 128000/64000KB (Java/Others) Subm ...

  6. LeetCode 892 Surface Area of 3D Shapes 解题报告

    题目要求 On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of ...

  7. 【LeetCode】892. Surface Area of 3D Shapes 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. LeetCode 883 Projection Area of 3D Shapes 解题报告

    题目要求 On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. ...

  9. 安徽师大附中%你赛day5 T3 树上行走 解题报告

    树上行走 题目背景 \(\mathrm{Smart}\) 的脑洞非常大, 经常幻想出一些奇怪的东西. 题目描述 某一天,\(\mathrm{Smart}\) 幻想出了一棵没有边际的二叉树,脑补着在那棵 ...

随机推荐

  1. 读书笔记--SQL必知必会04--过滤数据

    4.1 使用WHERE子句 在SELECT语句中,数据根据WHERE子句中指定搜索条件进行过滤. 搜索条件(search criteria)也称为(filter condition). WHERE子句 ...

  2. C#面试题汇总(未完成)

    泛型的好处: 1.可以保证类型安全以及避免装箱和拆箱操作,泛型类会在编译时由具体的类型去取代. 2.我们就拿一个ArrayList来说吧,ArrayList要进行拆箱操作,也就是ArrayList传入 ...

  3. 【分布式】Zookeeper会话

    一.前言 前面分析了Zookeeper客户端的细节,接着继续学习Zookeeper中的一个非常重要的概念:会话. 二.会话 客户端与服务端之间任何交互操作都与会话息息相关,如临时节点的生命周期.客户端 ...

  4. 《Head First 设计模式》之策略模式

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...

  5. 如果你也会C#,那不妨了解下F#(3):F#集合类型和其他核心类型

    本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-3.html 在第一篇中,我们介绍了一些基础数据类型,其实那篇标题中不应该含有"F#&q ...

  6. 游戏启示录 关于Update的相关问题

    游戏启示录 关于Update的相关问题 这里说的Update是指的游戏的主循环.一般情况下.为了程序的方便控制我们一般只会有一个主循环.所有的游戏逻辑都会在这一个循环中完成.(额,其实这么做有点浪费. ...

  7. Unity 3D json嵌套使用以及多种类型匹配

    我们控制端要发送很多命令给终端设备,其中有速度,方向,开关门,开关灯....方法千万种,我只取一瓢.我还小,不知道其他人是怎么写的.我喜欢把有规律的东西放在一起写!为了我的强迫症! using Uni ...

  8. .NET Core全面扫盲贴

    标签: .NETCore Asp.NETCore 1. 前言 2. .NET Core 简介 2.1 .NET Core是什么 2.2 .NET Core的组成 2.3 .NET Core的特性 2. ...

  9. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  10. eclipse启动tomcat无法访问

    eclipse启动tomcat无法访问 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能 ...