单调栈
饮料
一个饮料机,每分钟都可生产任意体积饮料,给你n个人的到达时间和所需最少饮料量,每个人到达时都会取走当前最大的饮料,问你满足所有人需求最少制作量。
首先特判可不可以,第i个人必须最早在i时刻到,否则不满足
然后,对于每一个人,可能多个人同时到达,这就需要提前制作饮料,从后往前遍历,若当前时间等于前一个,则需要提前制作,维护一个小根单调栈(因为如果我能提前制作,我肯定最后再制作大的),若当前值小于栈顶,则需优先满足栈顶(因为我要保证后面的人要取到最大的 如 2 2 - 4 7 第2个人拿的时候要有7,至少两个都是7)反之弹入单调栈。
玉蟾宫
给你一个仅有两种字符组成的矩形,问你只含一种字符的矩形最大面积是多少
朴素做法就是枚举,复杂度O(n^2 m^2);
考虑按高度计算,构造数组up[i][j]代表每行每列向上高度,然后构造两个单调栈求向左,向右第一个小于当前元素高度的idx,统计答案up[i][j] * (r[j]-l[j]-1);
复杂度O(C * nm);
构造
曼哈顿配对
给你2*k个点,要求你把它们分成k组,使得每组的曼哈顿距离和最大。
分别从x,y考虑,最优就是前k个大的减去后k个,最后和就是sigma(k_larger)-sigma(k_smaller)与顺序无关,对于一个点,他肯定只有四种状态,x大y大sa,x大y小sb,x小y大sc,x小y小sd,sa+sb=sc+sd,sa+sc=sb+sd,因此第一/四种情况 第二/三种情况两两相等,输出即可
伯特兰-切比雪夫定理
对于任意整数n>=1,必存在一个质数位于[n,2n]之间。
题目:构造一个排列,使得排列每个前缀的平均值(上取整)所构成的数列中至少有floor(n/3)-1个质数
根据定理,寻找任意一个在floor(n/3)到ceil(n*2/3)之间的质数p,然后构造摇摆数列p,p-1,p+1,p-2,p+2……,最后补齐即可.这样至少有floor(n/3)-1个质数
浙公网安备 33010602011771号