Printer Queue算法(华为: 打印任务排序, POJ3125)Golang实现 - Go语言中文社区

Printer Queue算法(华为: 打印任务排序, POJ3125)Golang实现


问题描述

Printer Queue(打印队列)POJ3125
打印机顺序打印问题

这是一道ACM算法题,上面的两个是求打印时间,还有一种是求打印顺序

输入和输出:

输入

3

1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1


输出

1
2
5

问题解析

输入解析

第一行的: 3

3个测试用例,每个测试用例包含两行,所以下面有6行,以最后一个用例为例解析

倒数第二行6 0

这是第3个用例的第一行

6: 这个测试用例有6个打印任务,
0: 你的任务在打印队列中的位置(0表示开头,就是排第一个)

倒数第一行的1 1 9 1 1 1

这是第3个用例的第二行,

表示打印队列中的6个任务(因为上一行的6 0中的6表明有6个任务)的优先级
你的任务根据上一行6 0中的0表明在0位置,优先级为1(1 1 9 1 1 1)

输出解析:

1 // 第1个测试用例,打印你的任务花了1分钟
2 // 第2个测试用例,打印你的任务花了2分钟
5 // 第3个测试用例,打印你的任务花了5分钟

注意

只有打印才计算时间.
比如:
上面的第3个测试用例.第一个被打印的是优先级为9的任务, 最开始他前面有2个优先级为1的任务,这2个任务会每次被移动到最后且不会打印,移动9前面的2个任务这个是不花时间的

Go代码实现打印时间

参考了Java实现

因为Go没有内置的queue,这里自己实现了一个Queue,实现的比较粗糙

package main

import (
	"errors"
	"fmt"
)

type Queue struct {
	Element []int
}

func (q *Queue)Pop()(int,error){
	if len(q.Element)>0{
		result := q.Element[0]
		q.Element = q.Element[1:]
		return result,nil
	}else{
		return -1,errors.New("no element to pop")
	}
}

func (q *Queue)Push(i int){
	q.Element = append(q.Element,i)
}


func main(){
	fmt.Println("程序开始了")
	var testCaseCount int  // 测试用例的个数
	var jobCount int       // 每个测试用例的打印任务数量
	var youJobPosition int // 每个测试用例的你的打印任务的位置
	fmt.Scanf("%d", &testCaseCount)
	fmt.Println("用例个数: ", testCaseCount)
	for i:=0;i<testCaseCount;i++{
		fmt.Scanf("%d", &jobCount)
		fmt.Scanf("%d", &youJobPosition)
		fmt.Printf("任务数量:%d, 你的打印任务的位置:%d n", jobCount, youJobPosition)
		job :=Queue{}
		jobIndex := Queue{}
		for i:=0;i<jobCount;i++{
			jobIndex.Push(i)
			var temp int
			fmt.Scanf("%d",&temp)
			job.Push(temp)
		}
		fmt.Println("收到的任务: ", job)
		time:=0
		for{
			jobToPrint,_ := job.Pop()
			jobPosition,_ := jobIndex.Pop()
			if shouldPrint(jobToPrint, job){
				time++
				if jobPosition == youJobPosition{
					break
				}
			}else{
				job.Push(jobToPrint)
				jobIndex.Push(jobPosition)
			}

		}
		fmt.Println("打印消耗的时间:", time)
	}
	
}

func shouldPrint(job int, q Queue) bool{
	for _,item:=range q.Element{
		if item>job{
			return false
		}
	}
	return true
}

在Goland这个IDE上的效果
在这里插入图片描述

Go代码实现打印顺序

待完成

打印机顺序打印问题

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cumt_TTR/article/details/103450933
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 23:19:27
  • 阅读 ( 2394 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢