内容提要

模拟,贪心


在讲这些东西之前,我们先来了解一个东西: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. POJ 3549 GSM phone(圆+扫描线+最短路)

    题目意思是求起点s到终点s的最短路,但是只能在圆的内部和边上走.一种可以想到的方法就是求出所有的交点,然后两两连边并验证合法性,但是这样的交点数规模有n2. 我们可以观察发现,我们在圆求并构成的图形中 ...

  2. 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2 (A-C)

    [MtOI2019]黑蚊子多 : 按题意模拟 #include<iostream> #include<cstdio> #include<cstring> using ...

  3. 【转】MySQL my.cnf 参数 详解

    [client] port    = 3306    //客户端端口号为3306 socket  = /tmp/mysql.sock  //套接字文件(sockets),这种文件一般用在网络上的资料套 ...

  4. 网络爬虫之JSOUP

    JSOUP中文文档:http://www.open-open.com/jsoup/推荐博客:http://www.cnblogs.com/jycboy/p/jsoupdoc.html 从一个URL加载 ...

  5. spark(2)

    1.spark模块 -------------------------------------- (1)Spark Core //核心库 (2)Spark SQL //核心库 (3)Spark Str ...

  6. git合并丢失代码问题分析与解决(错误操作导致)

    问题描述 我们在主干dev和branch1分支上进行并行开发.当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了. 那么,是在branch1上,作了删除提交导致的吗 ...

  7. 204-基于Xilinx Virtex-6 XC6VLX240T 和TI DSP TMS320C6678的信号处理板

    基于Xilinx Virtex-6 XC6VLX240T 和TI DSP TMS320C6678的信号处理板 1.板卡概述  板卡由我公司自主研发,基于VPX架构,主体芯片为两片 TI DSP TMS ...

  8. Python学习笔记-列表的增删改查

  9. PAT Advanced 1006 Sign In and Sign Out (25 分)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  10. 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...