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%的分数。。。

全部评论

相关推荐

评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务