内容提要

模拟,贪心


在讲这些东西之前,我们先来了解一个东西:high level

这个东西大体上就是你做题之前要先想清楚自己要写什么,怎么写,然后再写,不要有一点写一点

1.模拟

模拟算法算是很水的算法了

模拟算法的关键就是将人类语言翻译成机器语言

更准确的说是:将一个用日常大白话语言的东西用计算机语言抽象地表达出来

所以想要良好地掌握模拟算法,就要做到以下两点:

1.优秀的读题能力;

2.优秀的代码能力;

例:斗地主

High Level

手里有n张牌

有k个规则(k<?),每个规则可以打出一定的牌

请问最少要打出多少次牌

显然是个明显的深搜

void dfs(剩下多少张牌没打last,打了多少次牌ans)
{
if(last==) 规则1
规则2
......
规则k
}

这个题主要还是比较考验码力

写码一时爽,调试火葬场

注意:

善用子函数

变量名清晰,自己要明白是什么东西

善用high level

想一想用到每个输入的地方有多少可能,需不需要特判之类的

有一个小故事

一个程序员发布了一个程序,随后他收到了5个bug

他尝试为程序写了4个补丁去修复这5个bug,他成功了

于是他现在有9个bug

QwQ

写长代码的要领就在于一遍写对

1.模块化(如何思考一个问题)

2.没想清楚时不动键盘,画程序逻辑图

3.写完一部分就检查一部分

平时做题的时候要注意习惯,尽量一遍ac

善于出数据,对拍之类的

贪心:

贪心算法的数学原理:

大胆猜想无需证明(划掉)

局部最优得到全局最优

在每一个状态下,都选择当前的最优解而不考虑全局的影响

爬山算法能较好地体现贪心的思想

可以用贪心

如果长成这样,就会 陷入 局部最优解

贪心算法要满足两个条件:1.无后效性 2.不会陷入局部最优解

根据贪心的数学背景我们在做贪心题目时一般有两种策略

  1. 把一个问题划分成很多子问题,对每个子问题直接求最优解,然后合成一个最优解
  2. 对于当前局面,搜索所有可能的临近局面,选择最优的局面进行转移

贪心与其说是一个算法,不如说是一种思想。

贪心一般都用于求解最优化问题,但是最优化问题还有很多算法,不如动规和搜索、

贪心最重要的一点就是反例。一般做题过程就是在思考规律->寻找反例->找到算法或者是重新思考的循环种度过

所以要多做题积累经验和感觉

贪心策略:买便宜的直到个数上限,然后再买其他的

首先考虑前缀和

然后这个题如果不取模是很好做的,加上取模则有两种情况

  1. x-y(y<=x)
  2. X+M-y(y>x)

第一种情况,y越接近0越好

第二种情况,y越接近x越好

用set+upper_bound就ok

经典的活动安排问题

按照结束点从小到大排序,遍历每一个区间,如果没有和已经选择的活动冲突就选,否则就不选

另一道经典例题:喷水装置

先把他按照和草坪相切的点抽象成一个数轴上面的一些线段

然后变成了线段覆盖问题

将所有的区间按左端点从小到大排序,依次处理每一个区间,每次选择覆盖点s的区间中右端点最大的一个,直到区间已经包含了这个区间内所有的点为止

另一道例题

这个题可以以每个岛屿为圆心,以雷达半径为半径,和海岸线上有交点,然后跑区间选点

按照右端点从小到大排序,遍历每个区间,如果已经有点包含就转到下一个区间,否则选择最后一个点标记

下一道

首先,先把杀掉能回血的先杀了

显然杀的顺序按照消耗升序

杀完以后,不管用什么顺序杀掉剩下的怪,最后体力last是确定的

倒序来看,相当于将血药吐出来然后返还杀怪的消耗,那么显然也是按照损失体力(即血药回血量)升序,正回来即是降序。

即分为两部分,杀完能回血的按照消耗升序,剩余按血药回血量降序,然后模拟一遍判断是否合法即可

找到不超过它的最大的阶乘数然后减去就行了

其实十进制编码和转二进制编码差不多

把前k个数最大的提到最前面去,完了

这个题就是按照左右手乘积从小到大排序就可以了

证明:考虑只交换相邻两个i,i+1,则他们之前和之后的大臣拿到的金币都不变,我们只需考虑这两个大臣本身

首先我们设这两个大臣一个为i,另一个为i+1,且l[i]*r[i]<l[i+1]*r[i+1]

交换之前i大臣拿到的金币:S/r[i],i+1大臣拿到的金币:S*l[i]/r[i+1],两个取max

即max(S/r[i],S*l[i]/r[i+1])

交换之后i+1大臣变成了i,他拿到的金币:S/r[i+1]

第i大臣变成了i+1大臣,他拿到的金币S*l[i+1]/r[i],两个取max

即max(S/r[i+1],S*l[i+1]/r[i])

我们要求的是两者的最小值,即min(max(S/r[i],S*l[i]/r[i+1]),max(S/r[i+1],S*l[i+1]/r[i]) )

提出S,即S*min( max(1/r[i],l[i]/r[i+1]),max(1/r[i+1],l[i+1]/r[i]) )

然后我们显然有1/r[i]<l[i+1]/r[i],l[i]/r[i+1]>1/r[i+1]

如果我们想要max(1/r[i+1],l[i+1]/r[i])<max(1/r[i],l[i]/r[i+1]),则必然有l[i+1]/r[i]<l[i]/r[i+1],乘过去之后即得l[i]*r[i]>l[i+1]*r[i+1],与题目矛盾,故乘积大的一定在前面

qbzt day1 上午的更多相关文章

  1. PKUSC 模拟赛 day1 上午总结

    思考了一下第二题,觉得有无数种乱搞做法 类似什么bitset压位,MCS染色之类奇怪的做法 然而都是玄学正确性或者玄学复杂度 先放题解把 第一题显然具有单调性,二分就可以啦 O(nlogn),貌似输出 ...

  2. Day1上午解题报告

    预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  3. 云栖大会day1 上午

    参与云栖大会第一天感受 早晨参与内容 数据智能实践专场 议程是 09:00-09:25 互联网下半场用户增长之路 吕志国 [友盟+]CPO 09:25-09:50 数据开启智慧零售的升级引擎 刘延明 ...

  4. qbzt day7上午

    由于优盘咕咕咕了,所以这篇就咕咕咕了 以后还会补上的 qwq

  5. qbzt day6 上午

    还是合并石子,但是这次可以任意两个合并,并且求最大异或和 f[s]表示把s所对应的的石子合并为一堆的最小代价 最后求f[2^n-1] 怎么转移? 最后一次也是把两堆合并成一堆,但是会有很多情况,可以枚 ...

  6. qbzt day5 上午

    动态规划 递推  递归   记忆化搜索 斐波那契数列 1.用其他已经计算好的结果计算自己的结果(递推) 2.用自己的值计算别人的值(考虑对之后的项做出的贡献) cin >> n; f[]= ...

  7. qbzt day4 上午

    图论 最短路:dijkstra   spfa   floyd 最小生成树:kruskal 连通性:bfs/dfs    tarjan(强连通分量) 其它:拓扑排序    LCA 齿轮: 图的dfs树只 ...

  8. qbzt day3 上午

    内容提要 堆 lca(最近公共祖先) st表 hash 并查集 树状数组 线段树 数据结构 1.堆 Priority_queue 他滋兹:插入删除查询最大值(最小值) 分为大根堆小根堆 2.LCA 首 ...

  9. qbzt day2 上午

    内容提要 贪心 分治 分块 搜索 接着昨天的讲 过河问题 考虑AB是最快的人,CD是最慢的人,要把CD两个人送过河,只有两种方案,牵扯到四个人,并且n个规模的原问题化成了n-2个规模的子问题 那么最后 ...

随机推荐

  1. 关于微信H5页面开发中音乐不自动播放的解决方法

    我想应该有很多人在做H5场景应用.H5微刊.H5微杂志的时候加入背景音乐吧(客户需求),相信很多人一定碰过不能自动播放的时候,即使是相同的iPhone 5s也有不播放的时候,很蛋疼吧!? 之前我的解决 ...

  2. 使用JavaScript获取url中的参数值

    今天需要用到从url中获取参数,在网上找了几个JavaScript方法,mark下来.   一些可以使用的去获取url中指定的部分:如http://www.mystuff.com.cn/aboutus ...

  3. 思维体操: HDU1008 Elevator

    Elevator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. ThinkPHP中的"路由"是什么意思?

    路由(route)是指根据url, 分配到对应的处理程序的映射. 简单来说,就是一个路径的解析,根据客户端提交的路径,将请求解析到相应的模块/控制器/方法上. 转载自:https://blog.csd ...

  5. 内置的configparser模块和hashlib模块

    #configparser模块:配置解析模块 import configparser config = configparser.ConfigParser() #创建一个配置解析对象 config[& ...

  6. Listview四种视图VIEW

    http://wenku.baidu.com/link?url=65Ac8WL6j8KZwDlN8LyoxqFF5Jynvg80LnKc4jqTPQTY-59wwRDKhqGySYwxf6gZ9_6T ...

  7. P4513 最大连续字段和 (线段树+区间合并)

    题目链接:https://www.luogu.org/problem/P4513 题目大意:单点修改和求区间最大连续字段和 解题思路:很容易想到是用线段树来做,但是如何进行维护呢? 每个维护区间 [L ...

  8. 长沙理工大学第十二届ACM大赛-重现赛 D 小M和天平 (01背包)

    链接:https://ac.nowcoder.com/acm/contest/1/D 来源:牛客网 小M和天平 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言 ...

  9. EasySwoole的入门学习

    EasySwoole的入门学习 官网地址:https://www.easyswoole.com/ 一.安装easyswoole: (1)建立安装目录: cd /data mkdir easyswool ...

  10. 在 LaTeX 中同步缩放 TikZ 与其中的 node

    PGF/TikZ 是 Till Tantau 开发的基于 TeX 的绘图引擎.因其可以直接在 LaTeX 文稿中通过代码绘制向量图,所以是目前流行的 LaTeX 绘图解决方案之一. 在 tikzpic ...