最大音量

动态规划

题意:给出一个初始值和一个变化序列 c,在第 i 步可以加上或减去 c[i],求 n 步之后能达到的最大值。有一个限定值 maxlevel,在变化过程中值不能超过 maxlevel 也不能低于 0。

初步解法:搜索。每一步两种决策,及时阻止无效状态的搜索。

然后是(来自 lzw 大神的)剪枝:

  1. 如果当前已经找到的答案达到了 Maxlevel 就直接退出;
  2. 如果当前值加上后面所有的值也无法超过当前找到的答案就退出;
  3. 对于重复状态只搜索一次。

从第三步看出来其实是个动规。

正解:

用 f(i, j) 表示第 i 步能否达到值 j,则

f(i, j) = f(i-1, j-c[i-1]) or f(i-1, j+c[i-1])

旅行

不知道什么类型

题意:一个矩形区域中分为空地和障碍,每行每列最多一个障碍且在对角线方向上障碍不会相邻。求所有任意两点的最短距离的平均值。行列数小于 1000。

初步解法:暴力。本来想对于每个点统计从其出发的长度为 x 的路径条数,后来发现无法解决重复计算的问题。

正解:

首先不考虑障碍。在没有障碍的情况下,任意两点之间的最短距离很明显就是曼哈顿距离,那么答案就是sum{ |xi-xj|+|yi-yj| }。但是枚举每个点的复杂度是四次方。

然后我们发现,对于任意两行 i 和 j,在两行中各选一个空地,则其 x 的差值必然等于 |i-j|。所以我们可以分开计算 x 的差值和 y 的差值。那么对于 i 和 j,x 的差值的和为 (第 i 行空地数*第 j 行空地数)*(|i-j|)*2。对于 y 的统计类似。

加入障碍后其实并没有太大的变化,只是对于某些点之间的最短路径长度不再等于曼哈顿距离,而是曼哈顿距离+2。

关于为什么是曼哈顿距离+2,其实要得益于题目中对障碍点的限制。这样可以保证任何点对之间相互到达不需要绕行多次,自己画图就能知道。

那么什么样的点对之间的最短距离需要 +2?贴上 NOI 导刊上的图:

这样的规律具体概括起来如下:

首先,考虑竖直方向上。对于一个障碍点,从它的下方到它的上方必然需要绕行。如果它的右边一列也有障碍点且在本障碍点的上方,那么从本障碍点的下方到右边这一列的障碍点上方显然也需要绕行,然后再往右找有没有连续的且高度不断递增的障碍点,要到达这些障碍点的上方都需要绕行。对于障碍点的左边做类似考虑。然后横向上也类似。

统计出有多少点对需要 +2后计入总答案即可。

舞蹈课

题意:在一个队列中,每次找出相邻且舞蹈技术相差最小的异性,将其出列,出列后再次连成队列,不断重复此过程。人数少于 200000。

初步解法:模拟。0 分。

正解:

其实看到「每次选最小值」就应该用堆的。

我们把所有相邻的异性入堆,每次考虑栈顶元素。如果栈顶的两人有一人已经出列就直接将其弹出;否则将其从双向链表中删除,标记为已出列并计入答案,然后判断是否产生了新的异性舞伴,如果有就入堆。重复上述过程直到堆为空。

01day1的更多相关文章

  1. 二模01day1解题报告

    T1.音量调节(changingsounds) 有n个物品的背包(有点不一样,每个物品必须取),给出初始价值,物品价值可正可负(就是两种选择嘛),求可能的最大价值,不可能(<0或>maxs ...

随机推荐

  1. 【POJ】【1704】Georgia and Bob

    组合游戏 Nim游戏的一个变形 题解请看金海峰的博客 以下为引用: 分析:我们把棋子按位置升序排列后,从后往前把他们两两绑定成一对.如果总个数是奇数,就把最前面一个和边界(位置为0)绑定. 在同一对棋 ...

  2. 在MySQL中使用init-connect与binlog来实现用户操作追踪记录

    在MySQL中使用init-connect与binlog来实现用户操作追踪记录 分类: MySQL 前言: 测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查 ...

  3. java 中 String 类的几个问题

    首先,我们要搞清楚,在java中,引用和基本数据类型是存储在栈中的.而对象是存储在堆中的. 只有一个例外,就是String对象. 例如: String str1="test"; S ...

  4. C# 中使用JSON - DataContractJsonSerializer

    C#中使用JSON不需要使用第三方库,使用.NET Framwork3.5自带的System.Runtime.Serialization.Json即可很好的完成JSON的解析. 关于JSON的入门介绍 ...

  5. hdu 1755 A Number Puzzle

    这题枚举k节省时间 ;}

  6. hdu 3123 GCC

    这题分2种情况: 1) n>=m时,k!%m=0(k>=m),所以只需令n=m-1即可: 2) n<m时,正常情况处理即可. ;}

  7. C Primer Plus 第3章 数据和C 编程练习

    1. /* 整数上溢 */ #include <stdio.h> int main(void) { ; unsigned ; /* 无符号整数j像一个汽车里程指示表(形容的太好了,可参考& ...

  8. Thread的第五天学习

    1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如:卖票系统就可以这么做! package com.thread.demo; publi ...

  9. lintcode : 二叉树的最小深度

    题目: 二叉树的最小深度 给定一个二叉树,找出其最小深度. 二叉树的最小深度为根节点到最近叶子节点的距离. 样例 给出一棵如下的二叉树: 1 /     \ 2       3 /    \ 4    ...

  10. 常用的Linux终端

    常用的Linux终端 gnome-terminal (Gnome标配) xfce4-terminal (XFCE4标配) lxterminal (LXDE标配) konsole (KDE标配) 前面3 ...