9.10深信服笔试
深信服的笔试除了计算机的基础知识,还有一些逻辑推理,逻辑推理真的做的一塌糊涂。。。其实也就是一些常见的概率论、规律推理这类的问题,但是好久没见过,浪费了太多时间。
第一题
又是一年毕业季,深信服迎来了一批新员工,他们将被分配到各个部门。新员工依据特长和兴趣适合多个部门,但各部门的名额有限。请设计一个算法,尽可能多地将新员工分配到合适部门。
输入描述
第一行包含两个整数n和 m(1≤n, m≤1000),分别表示新员工和部门的数量。第二行包含 m 个整数,表示各个部门的名额(每个部门最多能接收的新员工数量)。接下来的n行,描述每个新员工所适合的部门,第一项是一个整数k(1≤k≤m),表示该新员工所适合的部门的数量。接下来k个整数表示这个新员工所适合部门的编号(1 到 m)
示例输入:
4 3
12 2
2 12
12
1 1
223
输出描述
输出可被分配到合适部门的新员工数量。上述输入对应的输出是:
4
思路:
贪心,首先统计每个部门有的HC以及每个部门投的HC,然后从前向后遍历,进行分配,但是最后只对了93%的样例。
package main import ( "fmt" "os" "bufio" ) var reader = bufio.NewReader(os.Stdin) func main() { var m,n int fmt.Fscan(reader,&n,&m) dept := make([]int, m + 1) for i := 1;i <= m ;i ++{ fmt.Fscan(reader, &dept[i]) } should := make([]int, m + 1) assign := make([][]int, n + 1) var k,x int for i := 1;i <= n;i ++{ fmt.Fscan(reader, &k) for j := 0;j < k;j ++{ fmt.Fscan(reader, &x) should[x] ++ assign[i] = append(assign[i], x) } } var res int for i := 1;i <= n;i ++{ var t int var flag bool last := 1100 for _,d := range assign[i]{ if dept[d] >= should[d]{ res ++ should[d] -- dept[d] -- flag = true break } if dept[d] > 0 && should[d] - dept[d] < last{ last = should[d] - dept[d] t = d } } if t != 0 && flag == false && dept[t] > 0{ should[t] -- dept[t] -- res ++ } } fmt.Println(res) }
好像贪心无法找到最优解。
第二题
在一个类似英雄联盟的游戏中,你选择了英雄 Kong。Kong 拥有n(1≤n≤100)个不同的技能,并且需要挑战一个血量为k(1≤k≤1000)的 Boss,你的任务是在最短时间内击杀该Boss。
战斗规则如下:
技能释放: 释放任意技能都需要1秒 时间。正整数数组harms代表每个技能对BosS造成的伤害值,假设选择释放i技能,那么技能释放完成后,Boss血量立即降低harms[i](1 ≤harms[]≤100);如果Boss剩余血量降至0或者负数,则Boss被击杀完成。
法力系统:
。Kong 的初始法力值与最大法力值均为 m(1≤m≤100)
。正整数数组costs代表每个技能消耗的法力值,释放第i个技能需要消耗 costs[i](1≤costs[i]≤100)点法力值,法力值在技能开始释放时进行扣除。只有在当前法力值不小于消耗值时,才能释放该技能。
每当时间过去1秒(无论是释放技能还是等待),Kong 的法力值都会恢复max(1,m/10)点(结果向下取整)。恢复后的法力值不会超过最大法力值 m无冷却时间: 所有技能都没有冷却时间。只要法力值足够,任何技能都可以连续释放。
等待:如果在某个时刻,Kong 的法力值不足以释放任何一个技能,他必须原地等待,直到法力值恢复到足以释放至少一个技能为止。
请计算击杀 Boss 所需的最短时间。
1输入描述
输入共四行:第一行包含两个以逗号分隔的正整数n和 m,分别代表技能的数量和最大法力值。第二行是以逗号分隔的n个正整数harms,代表每个技能的伤害值。第三行是以逗号分隔的n个正整数costs,代表每个技能的法力消耗.第四行是一个正整数 k,代表 Boss 的总血量.
输出描述
输出为一个整数,代表击杀 Boss 所需的最短时间
通过输出-1,骗了11%的分数。。。