建模题

2022-03-19  本文已影响0人  Eden0503

招标系统

/*
请你设计一个招标系统,需要实现以下几个功能:
AddTender(int userId, int projectId, int price) - 将投标方 userId 对项目 projectId 的投标金额 price 录入系统;
若系统中已存在 userId 对项目 projectId 的投标金额,则不作处理。

UpdateTender(int userId, int projectId, int price) - 若系统中存在投标方 userId 对项目 projectId 的投标金额,
则将该金额更新为 price,并返回更新前的投标金额;否则请返回 -1。

RemoveTender(int userId, int projectId) - 若系统中存在投标方 userId 对项目 projectId 的投标金额,删除该投标记录,返回被删除的投标金额;否则返回 -1

QueryTender(int projectId, int price) - 查询并返回系统中项目 projectId 的投标记录中,投标金额大于 price 且最接近 price 的投标方 userId;
o 若有多个投标方投标金额相同,比较投标方最后一次投标时间,返回投标时间最早的投标方 userId;(AddTender 和 UpdateTender 都是投标)
o 若不存在符合要求的投标记录,请返回 -1;

示例:
输入:
["TenderSystem","addTender","addTender","addTender","updateTender","updateTender","removeTender",
"removeTender","addTender","addTender","addTender","queryTender","queryTender"]
[[],[1,1,10],[2,2,20],[2,2,30],[1,1,40],[1,3,40],[1,1],[1,3],[1,2,20],[3,2,10],[4,2,40],[2,15],[5,10]]

输出:[null,null,null,null,10,-1,40,-1,null,null,null,2,-1]

示例 2:
输入:["TenderSystem","addTender","addTender","updateTender","queryTender"]
[[],[1,1,10],[2,1,20],[1,1,20],[1,10]]

输出:[null,null,null,10,2]

解释:
TenderSystem t = TenderSystem()
t.AddTender(1,1,10) // 在系统中添加 userId 为 1,projectId 为 1 的投标金额 10
t.AddTender(2,1,20) // 在系统中添加 userId 为 2,projectId 为 1 的投标金额 20
t.UpdateTender(1,1,20) // 在系统中将 userId 为 1,projectId 为 1 的投标金额更新为 20,并返回更新前的金额 10
t.QueryTender(1,10) // 查询系统中 projectId 为 1,投标金额大于 10 且最接近 10 的 userId,1 与 2 均符合条件,
由于 userId 1 更新时间晚(虽然 userId 1先做了首次投标,但是取其最后一次更新投标的时间来进行比较),因此返回最早录入系统的 userId 2

提示:
·         1 <= userId <= 10^4
·         1 <= projectId <= 10^6
·         1 <= price <= 10^8
·         addTender、updateTender、removeTender、queryTender 累计操作数 <= 1000
*/


package main

import "fmt"

func main() {
   obj := Constructor()
   obj.addTender(1, 1, 10)
   fmt.Println(obj)
   obj.addTender(2, 1, 20)
   fmt.Println(obj)

   obj.updateTender(1, 1, 20)
   fmt.Println(obj)

   obj.removeTender(1, 1)
   fmt.Println(obj)

   obj.queryTender(1, 10)
}

type TenderSystem struct {
   data map[int]map[int]tenderData
}

var currentTime = 0

const dataCap = 10000

type tenderData struct {
   price int
   time int
}

func Constructor() TenderSystem {
   return TenderSystem{make(map[int]map[int]tenderData, dataCap)}
}

func (tenderSystem *TenderSystem) addTender(userId int, projectId int, price int) {
   if _, ok := tenderSystem.data[projectId]; !ok {
      tenderSystem.data[projectId] = map[int]tenderData{}
   }

   if _, ok := tenderSystem.data[projectId][userId]; !ok {
      tenderSystem.data[projectId][userId] = tenderData{price, currentTime}
      currentTime++
   }
}

func (tenderSystem *TenderSystem) updateTender(userId int, projectId int, price int) int {
   if _, ok := tenderSystem.data[projectId][userId]; ok {
      var lastPrice = tenderSystem.data[projectId][userId].price
      tenderSystem.data[projectId][userId] = tenderData{price, currentTime}
      currentTime++
      return lastPrice
   }
   return -1
}

func (tenderSystem *TenderSystem) removeTender(userId int, projectId int) int {
   if _, ok := tenderSystem.data[projectId][userId]; ok {
      var lastPrice = tenderSystem.data[projectId][userId].price
      delete(tenderSystem.data[projectId], userId)
      return lastPrice
   }
   return -1
}

func (tenderSystem *TenderSystem) queryTender(projectId int, price int) int {
   var record = tenderSystem.data[projectId]
   var minPrice = 100000000
   var minTime = 0
   var ans = -1

   for u, m := range record {
      if m.price <= price {
         continue
      }

      if m.price < minPrice {
         minPrice = m.price
         minTime = m.time
         ans = u
      } else if m.price == minPrice && m.time < minTime {
         minTime = m.time
         ans = u
      }
   }
   return ans
}

上一篇下一篇

猜你喜欢

热点阅读