暴力&模拟&贪心&排序
文章平均质量分 81
模拟&贪心&排序
Happig丶
我的孤独,虽败犹荣
展开
-
贪心问题总结
经典问题排队接水问题问题描述nnn 个人在一个水龙头前排队接水,假如每个人接水的时间为 TiT_iTi,找出一个排队顺序,使得 nnn 个人的等待时间之和最少。思路每个人的等待时间为前面人的接水时间之和,排队越靠前被计算次数越多,因此越小的排在前面显然是最优的。选择不相交区间问题描述数轴上有 nnn 个开区间 (li,ri)(l_i, r_i)(li,ri),从中选出尽量多的区间,使得选出的这些区间两两没有交点。思路若区间相互包含,即区间 xxx 完全包含 yyy。那么选择 xxx原创 2021-07-31 19:50:07 · 479 阅读 · 0 评论 -
洛谷 P1631 序列合并(优先队列+归并)
传送门题目大意给出两个序列 a,ba, ba,b,将所有的 ai+bia_i + b_iai+bi 求出后然后排序,只需要输出其中的前 nnn 个。解题思路这题的思路很巧,是利用归并的思想。将 a,ba,ba,b 均排好序之后,我们在取的时候发现是有技巧的取的,如果 ai+bia_i + b_iai+bi 能取就肯定不会取 ai+1+bia_{i+1}+ b_iai+1+bi 或者 ai+bi+1a_i + b_{i +1}ai+bi+1。我么可以将其中的每 nnn 个数看做 n原创 2021-07-19 17:18:38 · 247 阅读 · 0 评论 -
HDU - 6709 Fishing Master(贪心)
传送门题目大意有一个池塘里面有nnn条鱼,每条鱼煮熟的时间最少为tit_iti(可以多煮一会但不能少),现在钓每条鱼的时间均为kkk。只有一口锅,也就是说鱼只能一条一条的煮,且只能一条一条的钓,在煮鱼的同时可以钓鱼,问煮完所有鱼最少花费的时间是多少?解题思路首先因为每条鱼都必须钓出来,因此总的钓鱼的时间是固定的k∗nk * nk∗n。能节约的时间其实也就是在钓鱼的时候顺带煮鱼,又因为第一条鱼必须先钓出来才能煮,因此必须在k∗(n−1)k*(n - 1)k∗(n−1)的时间内充分利用时间去煮鱼。原创 2021-05-24 15:32:00 · 216 阅读 · 0 评论 -
B - Mr.Maxwell and attractions(贪心+优先队列)
传送门题目大意有两种活动a,ba,ba,b,数量分别是n,m(1≤n,m≤1e5)n,m(1 \leq n,m \leq 1e5)n,m(1≤n,m≤1e5),每天只能在上午或者下午选择一种活动进行,每种活动可以重复选择但被选择一次后权值就会变为原来的60%60\%60%,特别地bbb类活动在下午被选择时只能得到其权值的80%80\%80%。现在有TTT天,其中限制最少选择k(1≤k≤T≤1e5)k(1 \leq k \leq T \leq 1e5)k(1≤k≤T≤1e5)天下午,问最终能得到的最大权原创 2021-05-08 16:40:27 · 163 阅读 · 0 评论 -
Codeforces gym102423 - J One of Each(贪心 + 栈)
传送门题目大意给出nnn个数,仅包含[1,k][1,k][1,k]中的数,且至少含有kkk个不同的数。找到一个长度为kkk的子序列是kkk的一个排列且字典序最小。解题思路这个题算是比较难想的贪心了,而且要用栈维护。一开始用尺取发现维护不了,贪心的话自己又陷入了如下几个误区:如果从后向前贪心,显然是可以的,但是对于已经选过的数,无法得知前缀中待选的数是否能全部出现,即使bitsetbitsetbitset维护也要爆内存。如果用双端队列从前向后维护,没出现的就入队,如果出现了重复的数要遍历队列,原创 2021-04-08 10:59:06 · 185 阅读 · 0 评论 -
G - 贪吃的派蒙(贪心)
传送门题目大意给出一个序列ppp,每个数代表一个人要吃东西的数量。其中最大的数为派蒙,除了派蒙之外每个人每次能吃的数量为[1,pi][1,p_i][1,pi],派蒙每次固定的吃pmaxp_{max}pmax个。给定kkk个食物,问能否让派蒙之前的那个人恰好吃完。解题思路设派蒙前面的人能吃的数量范围是[a,b][a,b][a,b],那么如果a≤k≤ba \leq k \leq ba≤k≤b显然一定成立。否则就必须要让派蒙吃到东西,而派蒙前面的人恰好为分界点,也就是说把这里当做终点,设除了派蒙之外原创 2021-01-31 18:20:54 · 467 阅读 · 3 评论 -
2018 ICPC 北京区域赛 I - Palindromes(规律+大数+模拟)
传送门题目大意回文数字是指合法的字符串数字,然后是回文字符串。输出第k(k≤10100000)k(k \leq 10^{100000})k(k≤10100000)个回文字符串。解题思路kkk这么大,显然是找规律的题目,那么不难发现回文数的个数应该按照位数来看,然后找到每个区间:位数为111:[0,9][0,9][0,9]共101010个;包含的个数区间为[1,10][1,10][1,10]位数为222:[11,99][11,99][11,99]共999个;包含的个数区间为[11,19][11原创 2021-01-13 19:26:01 · 184 阅读 · 0 评论 -
2018 ICPC 北京区域赛 B - Heshen‘s Account Book(字符串模拟)
传送门题目大意给出若干行字符串,其中每个字符串可能由字母或者数字组成,现在我们需要输出所有的合法数字以及每行合法数字的个数,合法数字是指没有前导0且字符串中不含有字母。然后题目还给出一个条件是如果当前行的结尾和下一行的开头都是合法数字,那么他们是被当做拼起来的字符串且归属于上一行。解题思路很多细节!首先大体的思路是得到一共有多少行,因为如果下一行只有一个字符串且和上一行能够拼接,因此先将所有的具体的行得到#include <bits/stdc++.h>using namespac原创 2021-01-13 18:03:49 · 210 阅读 · 0 评论 -
离散化及两种主要实现
离散化所谓离散化就是当我们需要存一定数量的数组时,数组开不了那么大,但是数字的种数不多,故离散化就是改变了数据数量的相对大小去重离散化给定一个包含大量重复元素数组,而我们用到其中的每一个数即可,去重显然是更好的选择unique函数头文件:#include <algorithm>注意:使用前一定要先将无序的列表排序,使重复的元素相邻原理:该函数的作用是“去除”容器或者数...原创 2020-02-12 21:02:53 · 469 阅读 · 5 评论 -
快速排序
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列主要步骤:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分,为了方便我们假设区间最左边的值为分界值(2)设置两个哨兵i,j,i是左边的哨兵,j是右边的哨兵。不断移动...原创 2020-03-26 14:41:17 · 116 阅读 · 0 评论 -
归并排序
归并如果a,b数组是已经排序后的两个数组,最终我们需要的是合并到c数组。将a数组的所有数字单独看成n个子数组,将b数组所有数字都单独看成m个子数组。每次将a,b的两个子数组比较,最后可能某个数组没有到最后,再都添加到c数组。这样按大小添加到c数组中,保证了每个数字前后左右要么是同一数组,要么也经过了大小比较排序,肯定是排好序的数组const int maxn=?;int a[n],b[m],...原创 2020-03-26 10:43:12 · 151 阅读 · 0 评论 -
最大连续和——从超时到秒解
最大连续和给定一个数字序列a1,a2,…,an,求序列中的一段连续序列 [ai , aj] (1<=i<=j<=n),使得该序列和为最大和暴力解法对于每一段子序列 [ i , j ],找最大和。三重循环,时间复杂度O(n3)const int maxn=?;int a[maxn];int n;int maxsum(){ int ans=a[1]; ...原创 2020-03-25 23:52:44 · 218 阅读 · 2 评论 -
HDU - 6812 Kindergarten Physics(分块/规律)
题目链接这题第一眼看上去想积分,然后队友翻开大物课本疯狂学习,看了半个小时也没有好的思绪,然后另外一名队友说分块能写,就尝试了而且成功了比赛时想的是,因为距离公式为s=vt+0.5at2s=vt+0.5at^2s=vt+0.5at2,然后t<0.001t<0.001t<0.001应该可以忽略的,那么就按固定时间delt=0.001delt=0.001delt=0.001计算1000∗t1000*t1000∗t次,这样就能得到答案了!可是实际上仔细考虑GGG以及距离范围,发现在精度范原创 2020-08-02 09:24:38 · 252 阅读 · 0 评论 -
LightOJ - 1213 Fantasy of a Summation(找规律)
传送门题目大意给定长度为nnn的数组aaa,下面循环的深度为kkk,求sumsumsum:int n, sum = 0;int a[maxn];ll solve(){ for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { ... sum +=原创 2020-10-23 08:47:03 · 155 阅读 · 0 评论 -
HDU - 6860 Fluctuation Limit(双向贪心/思维)
传送门题目大意:给出若干个区间,每次在一个区间内选择一个数xxx后,那么该数的波动范围[x−k,x+k][x-k,x+k][x−k,x+k]必须和下一个区间有交集,然后可以从交集中任取一个数再判断下下一个区间,以此类推…思路假设我们从第一个区间[a,b][a,b][a,b]内开始取数,那么第一个区间的最大取值范围是[max(0,a−k),b+k][max(0,a-k),b+k][max(0,a−k),b+k],我们要保证取得的数既在下一个区间内,然后又对下下一个区间不会产生不可取数的影响,这样单方原创 2020-08-14 10:11:23 · 198 阅读 · 0 评论 -
2018 宁夏邀请赛 Fight Against Monsters(贪心)
题目链接观察可以发现,HP是没有办法直接去算的,需要转化为它能在英雄手中存活的回合数,即次数。构造结构体存放三个变量。输入时计算出time接下来需要确定攻击的顺序,那到底怎么攻击才能让英雄受到的总伤害最小呢?首先肯定是假设直接与结构体的三个变量有关,但均被推翻。我们不难想到,每当一个怪物被选为攻击对象后,它能攻击的回合总数是包括它在内的之前所有被击杀怪物的存活回合数,造成的伤害也是直接...原创 2019-11-21 19:38:57 · 157 阅读 · 0 评论 -
LightOJ - 1234 Harmonic Number(调和级数/分块打表)
传送门题目大意求f(n)=∑i=1n1if(n)=\sum_{i=1}^n \frac{1}{i}f(n)=∑i=1ni1解题思路方法一看到这个东西异常熟悉,不就是高数讲过的调和级数吗,但是忘记通项公式是什么了,去百度,有的地方说函数的极限是f(n)=ln(n+1)+γf(n)=ln(n+1)+ \gammaf(n)=ln(n+1)+γ,但是实际上这个是不精确的,正确的极限应该是ln(n)+γ+12nln(n)+ \gamma + \frac{1}{2n}ln(n)+γ+2n1,测试时在1原创 2020-10-21 17:28:21 · 164 阅读 · 0 评论