招聘策略


/*
题目 第一行整数表示招聘部门个数deptNum, 1 <= deptNum <= 10
随后deptNum 行依次表示每个部门的要求,记录于deptDemands数组中,
deptDemands[i] 表示变化为i的部门的目标人数 机考最低分 技面最低分,目标人数范围【1,200】
最低分范围 【100, 150】
接下来一行的整数表示应聘着数量 candidateNum, 1 <= candidateNum <= 10000
随后candidateNum 行依次表示每个应聘者的信息,记录于数组 candidateAbilities 中 candidateAbilities[j]
表示编号为j的应聘者的机考分数 技面分数, 机考和技面分数取值范围为【100,200】
输出
按部门编号从小到大,每行输出一个部门所录取人员的编号;若没有录取人员,输出空序列[]
输入
2
2 130 120
1 150 150
6
150 100
160 190
150 200
200 190
160 190
160 190
输出
2 1 4
3
解释
招聘录取过程如下
第一轮 按部门编号从小到大,部门0 先选人 ,按选人规则优先录取应聘者2,然后是部门1 选人,优先录取应聘者3
部门1招满,退出轮询
第二轮 部门0 选人,应聘者1,4,5的能力值相同,录取编号小的应聘者1
两轮后,部门0和部门1都达到人数目标,完全常规录取
补录: 部门0先选人,应聘者4,5 与此前最后录取的1的能力相同,按规则补录一人 应聘者4后结束招聘,然后部门1补录,没有人与
此前最后补录的应聘者3具备相同的能力值

样例2
输入
2
2 100 150
1 150 100
2
100 120
150 100
输出
【】
【1】
解释
两个应聘者都不满足部门0的要求,因此部门0未录取
应聘者1满足部门1的要求,因此部门1录取应聘者1

样例3
输入
3
1 100 100
1 100 120
1 100 150
5
100 200
100 200
100 200
100 200
100 200
100 200
输出
【0 3】
【1 4】
【2】
解释
常规录取阶段, 三个部门分别录取应聘者 0,1,2
补录阶段,部门0先选人,补录了应聘者3,剩下应聘者4,满足部门1和部门2的补录条件,但是部门1先选人

* Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
* Description: 上机编程认证
* Note: 缺省代码仅供参考,可自行决定使用、修改或删除
* 只能import Go标准库
*/
package main

import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
)

type deptDemand struct {
deptId int // 部门编号
employNum int // 招聘目标
progmThd int // 机考门槛值
techThd int // 技面门槛值
}

type candidate struct {
peopleId int // 应聘者编号
progmGrade int // 机试分数
techGrade int // 技面分数
}

// 待实现函数,在此函数中填入答题代码
func getRecruitmentResult(deptDemands []deptDemand, candidateAbilities []candidate) [][]int {
return [][]int{}
}

func main() {
reader := bufio.NewReader(os.Stdin)
deptNum := readInputInt(reader)
deptDemands := readDeptDemandsList(reader, deptNum) // 每个部门的要求
candidateNum := readInputInt(reader)
candidateAbilities := readCandidateList(reader, candidateNum) // 应聘者的信息
result := getRecruitmentResult(deptDemands, candidateAbilities)
for _, val := range result {
fmt.Println(fmt.Sprint(val))
}
}

func readInputInt(reader *bufio.Reader) int {
var num int
if _, err := fmt.Fscanf(reader, "%d\n", &num); err != nil {
fmt.Println(err.Error())
return 0
}
return num
}

func readDeptDemandsList(reader *bufio.Reader, num int) []deptDemand {
deptDemands := make([]deptDemand, num)
for i := 0; i < num; i++ {
lineBuf, err := reader.ReadString('\n')
if err != nil && err != io.EOF {
fmt.Println(err.Error())
return nil
}
lineBuf = strings.TrimRight(lineBuf, "\r\n")
lineBuf = strings.TrimSpace(lineBuf)
intNums := map2IntArray(lineBuf, " ")
if len(intNums) != 3 {
fmt.Println("input is error")
return nil
}
deptDemands[i] = deptDemand{deptId: i, employNum: intNums[0], progmThd: intNums[1], techThd: intNums[2]}
}
return deptDemands
}

func readCandidateList(reader *bufio.Reader, num int) []candidate {
candidateAbilities := make([]candidate, num)
for i := 0; i < num; i++ {
lineBuf, err := reader.ReadString('\n')
if err != nil && err != io.EOF {
fmt.Println(err.Error())
return nil
}
lineBuf = strings.TrimRight(lineBuf, "\r\n")
lineBuf = strings.TrimSpace(lineBuf)
intNums := map2IntArray(lineBuf, " ")
if len(intNums) != 2 {
fmt.Println("input is error")
return nil
}
candidateAbilities[i] = candidate{peopleId: i, progmGrade: intNums[0], techGrade: intNums[1]}
}
return candidateAbilities
}

func map2IntArray(str string, dem string) []int {
tempArray := strings.Split(str, dem)
result := make([]int, len(tempArray))
for index, value := range tempArray {
value = strings.TrimSpace(value)
intVal, err := strconv.Atoi(value)
if err == nil {
result[index] = intVal
}
}
return result
}
posted @ 2022-10-05 17:07  易先讯  阅读(95)  评论(0编辑  收藏  举报