A
=w=
B
QAQ
C
^o^
D
题意:小明要和a+b杯茶共n杯,有绿茶a杯,黑茶b杯。小明喝同一种茶最多连续喝k杯。问是否存在一种方案使得小明喝完这n杯茶,是则输出任意一种顺序。
分析:贪心
我们的目标是尽可能制造绿茶和黑茶相等的局面,所以先尽可能将多的那个喝成与少的那个相等,若相等则直接可以了,若不相等则喝一杯少的,再继续尽可能喝那多的,如果中间无法操作则-1
E
题意:现在给了n个数字,然后还有一个1到m,代表可以把a里面任意一个数换成1-m,最后需要保证a数组里面的所有的数的奇数个数等于偶数个数,问最少的换的次数,以及换了之后的数组是什么样子的,当然还有不能达到的情况,输出“-1”。
分析:思维题
把奇数和偶数分开处理
开两个set,将奇数数组里的不相同的数放进一个set,将偶数数组里的不相同的数放进另一个set
奇数指针p=1,偶数指针q=2
依次遍历奇数数组和偶数数组中重复出现的数(它们需要被改掉) 每次放数,p+=2,q+=2,当然如果p,q在各自的set中出现过,则还要再增加,一直到没有出现过为止
当然这样只是能保证奇数数组中的数都不同,偶数数组中的数都不同,而奇数和偶数的总数还不一定相等
为了解决这种情况,不放假设奇数数量>偶数数量
那么需要先开始用p的自增来替代偶数数组中重复出现的数,直到奇偶数量平衡
在上述所有的p,q自增操作中,一旦超过了m,则说明不可行,输出-1
在操作过程中,记录下每个位置最终的答案得到ans[],与原始的x[]比较得出最少更改多少个
F
题意:一个人又k的时间听n首音乐,每一首音乐都有一个愉快度,然后这个人可以选择听这首音乐完整时间t,1/2向上取整的时间,还要满足听了一半的个数<=m
分析:模拟+set
考虑一段x首歌,最优的方法肯定是让其中时间最长的m首歌曲时间减半
考虑一个可行解i~j,那么对于下一个可行解i+1~x,那么x>=j,即两个指针是非单减的,所以只要弄个数据结构维护这一类似单调队列的东西
具体的做法是弄两个set表示一段区间中未减半时间的和减半时间的
每次判断j指针能否后移,先看减半时间的set是否满了,若未满直接判断加入减半时间是否合法;若满了则判断减半时间的set中的最小值和t[j]大小,如果t[j]大就将最小的那个放进未减半时间set中,t[j]放入减半时间那个,判断是否合法
对于每个i指针,求出最远的j指针,并不断更新答案
然后需要对i指针进行删除
若i在未减半set中,直接删除,若在减半set中,把i删除后还需要把另一个set中最大的那个加入减半set中
注意set.end()是开区间,所以取一个set最大的时候需要先得到它的迭代器,然后自减
G
题意:给出一颗树每个深度节点的个数,并给出叶子节点的个数,问能否形成一个树,若能输出任意一种
分析:构造
考虑最少要多少叶子节点
最底层的,以及第i层节点数量比第i+1层节点数量多的这种都肯定是叶子节点,统计最少叶子节点的总数,和给出的比较,如果不够,则输出-1,否则将那种节点全部标记为叶子节点
对于那些多的叶子节点,可以自底向上尽可能标记
最后根据标记输出可行方案即可
先看哪些是必须为叶子节点的