前两天在牛客网做了模拟笔试题,有两道感觉挺有意思的,这里总结一下。其中一道题稍微修改了点条件,进阶一下。
特么的我都不想说,其实这修改的条件是我笔试时没读清题,直接往难了去想的,就没做出来(呜呜呜,哭晕在厕所)。以后做题一定要审清题啊!!!
第1
题
牛牛和牛妹最近迷上了新版消消看,该游戏规则如下:
在一个
01
串中,每一轮,玩家都可以选择一串连续相同字符进行消除,消除之后,左右两侧剩余的字符自动拼接,重新形成一个字符串。例如,在
101001
中,牛牛选择了第四个和第五个字符,它们连续且都是0
,满足消除条件,而当它们消除之后,左侧剩余的101
和右侧剩余的1
会拼接到一起,即,消除后剩余的01
串为:1011
。计分规则如下:消除了几个
1
就计几分。允许消除单个字符,因此,直到消成空串时游戏结束。对于给定的
01
串,由牛妹先手进行消除,两个人都以最优策略且以得分高为目标进行消除,请问最后,哪个人的得分会比较高?返回一个二元数组,分别是先手得分和后者得分。进阶:如果不允许只消除单个字符,也就是说,直到消成没有连续的
1
或0
后游戏就结束。例子
1
:
1
2
3 输入: s = "0110110101001111"
输出: [7, 3]
解释: 先手得分为 4 + 2 + 1 = 7, 后手得分为 2 + 1 = 3进阶的例子
2
:
1
2
3
4
5
6
7
8
9 输入: s = "011011001001001111"
输出: [8, 2]
解释: 先手得分为 4 + 2 + 2 = 8, 后手得分为 2
原始串 --> 011011001001001111
消 1 --> 000000001001000000 得分:6, 2
后手消 0 --> 1001000000 得分:6, 2
先手消 0 --> 1001 得分:6, 2
后手消 0 --> 11 得分:6, 2
消 1 --> 00 得分:8, 2
1 | // 对于允许消除单个字符的情况 |
1 | // (也可能是我想复杂了, 如果你有更简单的方法一定告诉我!) |
第2
题
西部世界有
n
个赏金猎人,每个赏金猎人都有两个属性战斗里和所拥有金钱。attack[i]
和money[i]
分别表示第i
个赏金猎人的战斗力和所拥有金钱,保证每个赏金猎人的战斗力不相同。每个赏金猎人都只有k
发子弹,这意味着他最多可以击败k
个战斗力比他小的赏金猎人并获取他们的金钱。输出每一个赏金猎人最多拥有多少金钱。Constraints:
1 <= n <= 10^5^, 0 <= k <= min(n - 1, 10).
1 <= attack[i], money[i] <= 10^9^.
1 | vector<int> maxMoney(vector<int> &attack, vector<int> &money, int k) { |
1 | // 使用用优先级队列做为堆 |