建模题

作者: Eden0503 | 来源:发表于2022-03-19 18:04 被阅读0次

    招标系统

    /*
    请你设计一个招标系统,需要实现以下几个功能:
    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
    }
    
    

    相关文章

      网友评论

          本文标题:建模题

          本文链接:https://www.haomeiwen.com/subject/idladrtx.html