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代码实现打印顺序

待完成

打印机顺序打印问题

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值