寒假集训 - 个人训练赛 1

待补题目:

题解

A. Left-handers, Right-handers and Ambidexters

题目大意:

有 3 种属性的人 a, b, ab。其中 ab 属性的人既可以当 a 也可以当 b。问如果组建一个团队要求 a, b 属性的人各一半,这个团队的最大人数是多少?

分析:

不妨设 \(a < b\) , 那么分为两种情况:

  1. \(a + ab < b\) 的时候,答案就是 \(2(a + ab)\)
  2. \(a + ab \le b\) 的时候,先用 ab 填满 a, 使得 a 的个数和 b 的个数相同,然后 ab 再对半分给 a, b。答案就是 \(2(b + (ab - (b - a)) / 2)\)

所以就是一水题……

B - Intercepted Message

题目大意:

将两个序列分成相同的块数,使得每一个块的和相同。问最多能分成几块?

分析:

类似于双指针的想法,当第一个序列的和小于第二个序列和的时候,上面的指针右移动,直到两个序列的和相同,这时块数加一,然后两个序列的和重置(反之亦然)。直到两个指针都指向了序列尾。

C - Zebras

题目大意:

给定一段 01 序列,问能不能分成几个子序列,使得每个子序列都是 0 开始和结尾,且 01 交替。

分析:

一开始读错题目了…… 看漏了 01 交替这个条件,直到我 wa 了一发。

其实不用想那么多,直接模拟即可。答案用队列维护。再开个数据结构(我用队列)标记下当前这个答案队列是 0 结尾,还是 1 结尾。
那么从左到右扫一遍:

当遇到 1 的时候,查询当前是否有 0 结尾的答案队列,有,就插入到这个答案队列里,并把标记改为 1 结尾。没有,就直接输出 -1 即可。

当遇到 0 的时候,查询当前是否有 1 结尾的答案队列,有,就插入并修改标记,没有,就多开一个队列,表示这是一个新的队列,并且是 0 结尾的。

扫完之后,0 结尾的队列的个数就是子序列个数。注意这个时候, 1 结尾队列应该为空(为此,我还 wa 了一发)这里要判断一下。剩下的就是序列输出了,队列不断弹出即可。

G. Feed the cat

题目大意:

大意是在某个给定的时间点,猫有 H 个饥饿值,然后每分钟会掉 D 点饥饿值,你需要去买一些面包给猫。每个面包降低 N 点饥饿值。每个面包的价格为 C 。但是在过了 20: 00 的时候,面包会打八折。问把猫的饥饿值降低到小于等于 0 的最小花费是多少。

分析:

很显然 20: 00 后立刻买。
20: 00 前计算立刻买和 20:00 的时候买的花费,取比较小的那一个就行了。

H - Not simply beatiful strings

题目大意:

定义如果一个字符串为只含有两种不同字母的,那么这种字符串就是特殊的。
给定一个字符串,询问是否能分为两个特殊的字符串。

分析:

水题……计算字母种数,显然,当种数为 1 或者 大于 4 的时候,不能分成两个特殊的字符串。
当字母种数为 4 的时候一定可以。
当种数为 2,3 的时候,只要这几种字母的个数都不为 1,那么肯定能分。

写完我才发现原来都是水题……手速好慢啊

猜你喜欢

转载自www.cnblogs.com/ljxtt/p/12199402.html