diff --git a/hashcode2022_V_group.py b/hashcode2022_V_group.py index a171e29..fce19ae 100644 --- a/hashcode2022_V_group.py +++ b/hashcode2022_V_group.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""HashCode2022_张杰.ipynb +"""HashCode2022_BUG.ipynb Automatically generated by Colaboratory. @@ -16,8 +16,8 @@ import numpy as np import os import math -File_Directory = 'drive/MyDrive/polyhash/DataSet/' -File_Name = 'a_an_example.in.txt' +File_Directory = 'drive/MyDrive/Ecole/PolyHash2022/DataSet/' +File_Name = 'f_festive_flyover.in.txt' File_Path = File_Directory+File_Name DataSet = [line.strip().split() for line in open(File_Path, "r")] @@ -64,6 +64,7 @@ def readLine(m = 0, n = 2, offset = 1): return line class Person: + priority:float def __init__(self, infomationLine): self.name, self.score, self.weightOfGift, self.x_position, self.y_position = infomationLine @@ -74,6 +75,9 @@ class Person: global Score Score += self.score + def caculatePriority(self): + return self.score / (self.weightOfGift * caculateDistance([0,0], (self.x_position, self.y_position))) + class People: info = [] @@ -93,11 +97,8 @@ class People: plt.show() - - - - class Santa: + tableauDeDistribution = [] position = [0.0,0.0] speed = [0.0,0.0] weightOfCarrots:int = 0 @@ -114,19 +115,14 @@ class Santa: def getWeight(self): return self.weightOfCarrots + self.weightOfGift +#[[2000.0, 20.0], [3000.0, 15.0], [5000.0, 10.0], [6000.0, 9.0], [7000.0, 8.0]] def nowSpeedLimit(self): w = self.getWeight() assert w >= 0 - if w <= self.speedLimitTable[0][0]: - return self.speedLimitTable[0][1] - elif w > self.speedLimitTable[0][0] and w <= self.speedLimitTable[1][0]: - return self.speedLimitTable[1][1] - elif w > self.speedLimitTable[1][0] and w <= self.speedLimitTable[2][0]: - return self.speedLimitTable[2][1] - elif w > self.speedLimitTable[2][0] and w <= self.speedLimitTable[3][0]: - return self.speedLimitTable[3][1] - else: - return 0 + for i in range(len(self.speedLimitTable)): + if w < self.speedLimitTable[i][0]: + return self.speedLimitTable[i][1] + return 0 # DONE 此速度限制speedLimit为限制表不是当前限制,我们下一步要定义nowspeedLimit @@ -138,21 +134,37 @@ class Santa: self.weightOfCarrots -= 1 def AccUp(self, s): - assert self.isAllowedBySpeedLimit(s) - self.speed[1] += s - self.consumeCarrot() + if self.timeLimit>0: + assert self.isAllowedBySpeedLimit(s) + self.speed[1] += s + self.consumeCarrot() + print("AccUp:",s) + else: + pass def AccDown(self, s): - assert self.isAllowedBySpeedLimit(s) - self.speed[1] -= s - self.consumeCarrot() + if self.timeLimit>0: + assert self.isAllowedBySpeedLimit(s) + self.speed[1] -= s + self.consumeCarrot() + print("AccLeft:",s) + else: + pass def AccRight(self, s): - assert self.isAllowedBySpeedLimit(s) - self.speed[0] += s - self.consumeCarrot() + if self.timeLimit>0: + assert self.isAllowedBySpeedLimit(s) + self.speed[0] += s + self.consumeCarrot() + print("AccRight:",s) + else: + pass def AccLeft(self, s): - assert self.isAllowedBySpeedLimit(s) - self.speed[0] -= s - self.consumeCarrot() + if self.timeLimit>0: + assert self.isAllowedBySpeedLimit(s) + self.speed[0] -= s + self.consumeCarrot() + print("AccLeft:",s) + else: + pass def LoadCarrots(self, w): self.weightOfCarrots += w @@ -160,15 +172,23 @@ class Santa: self.weightOfGift += w def DiliveryGift(self,p: Person): - assert caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit - self.weightOfGift -= p.weightOfGift - assert self.weightOfGift >= 0 - p.getScore() + if self.timeLimit >=0 and caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit: + assert caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit + self.weightOfGift -= p.weightOfGift + assert self.weightOfGift >= 0 + p.getScore() + print("Delivert gift to",p.name) + else: + pass def Float(self, t:int = 1): - self.position[0] += self.speed[0] * t - self.position[1] += self.speed[1] * t - self.timeLimit -= t + if (self.timeLimit - t) >=0: + self.position[0] += self.speed[0] * t + self.position[1] += self.speed[1] * t + self.timeLimit -= t + print("Float:",t) + else: + pass def getSituation(self): print("Now position is:",self.position) @@ -177,349 +197,248 @@ class Santa: print("Now weightOfGift is:",self.weightOfGift) print("Now weightOfCarrots is:",self.weightOfCarrots) + + def generateTableauDeDistribution(self, pp: People): + self.tableauDeDistribution = sorted(pp.info, key=lambda x: x.caculatePriority(), reverse=True) + return self.tableauDeDistribution + + + def kidoneWay(self,x:int,p:Person): v = self.nowSpeedLimit() - if isinstance(x/v,int) and x > 0: + if isinstance(x/v,int) and x > 0 : t = x/v self.AccUp(v) - print("AccUp:",v) self.Float(t) - print("Float:",t) self.AccDown(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) + self.Float(1) self.DiliveryGift(p) - print("Delivert gift to",p.name) t = x/v self.AccDown(v) - print("AccDown:",v) - self.Float(t) - print("Float:",t) + self.Float(t) self.AccUp(v) - print("AccUp:",v) - self.Float() - print("Float:",1) + self.Float(1) - elif isinstance(x/v,int) and x < 0: + elif isinstance(x/v,int) and x < 0 : t = abs(x)/v self.AccDown(v) - print("AccDown:",v) self.Float(t) - print("Float:",t) self.AccUp(v) - print("AccUp:",v) - self.Float() - print("Float:",1) + self.Float(1) self.DiliveryGift(p) - print("Delivert gift to",p.name) t = abs(x)/v self.AccUp(v) - print("AccUp:",v) self.Float(t) - print("Float:",t) self.AccDown(v) - print("AccDown:",v) - self.Float() - print("Float:",1) + self.Float(1) - elif x < v and x > 0: + elif x < v and x > 0 : v = x self.AccUp(v) - print("AccUp:",v) - self.Float() - print("Float:",1) + self.Float(1) self.AccDown(v) - print("AccDown:",v) - self.Float() - print("Float:",1) + self.Float(1) self.DiliveryGift(p) - print("Delivert gift to",p.name) v = x self.AccDown(v) - print("AccDown:",v) self.Float() - print("Float:",1) self.AccUp(v) - print("AccUp:",v) - self.Float() - print("Float:",1) + self.Float(1) - elif abs(x) < v and x < 0: + elif abs(x) < v and x < 0 : v = abs(x) self.AccDown(v) - print("AccDown:",v) - self.Float() - print("Float:",1) + self.Float(1) self.AccUp(v) - print("AccUp:",v) - self.Float() - print("Float:",1) + self.Float(1) self.DiliveryGift(p) - print("Delivert gift to",p.name) v = x self.AccUp(v) - print("AccUp:",v) - self.Float() - print("Float:",1) + self.Float(1) self.AccDown(v) - print("AccDown:",v) - self.Float() - print("Float:",1) + self.Float(1) - elif x > v and x > 0: + elif x > v and x > 0 : t = x//v v1 = v - (x - t*v) self.AccUp(v) - print("AccUp:",v) self.Float(t) - print("Float:",t) self.AccDown(v1) - print("AccDown:",v1) self.Float() - print("Float:",1) self.AccDown(v - v1) - print("AccDown:",v - v1) - self.Float() - print("Float:",1) + self.Float(1) self.DiliveryGift(p) - print("Delivert gift to",p.name) t = x//v v1 = v - (x - t*v) self.AccDown(v) - print("AccDown:",v) self.Float(t) - print("Float:",t) self.AccUp(v1) - print("AccUp:",v1) - self.Float() - print("Float:",1) + self.Float(1) self.AccUp(v - v1) - print("AccUp:",v - v1) - self.Float() - print("Float:",1) + self.Float(1) - elif abs(x) > v and x < 0: + elif abs(x) > v and x < 0 : t = abs(x)//v v1 = v - (abs(x) - t*v) self.AccDown(v) - print("AccDown:",v) self.Float(t) - print("Float:",t) self.AccUp(v1) - print("AccUp:",v1) - self.Float() - print("Float:",1) + self.Float(1) self.AccUp(v - v1) - print("AccUp:",v - v1) - self.Float() - print("Float:",1) + self.Float(1) self.DiliveryGift(p) - print("Delivert gift to",p.name) t = abs(x)//v v1 = v - (abs(x) - t*v) self.AccUp(v) - print("AccUp:",v) self.Float(t) - print("Float:",t) self.AccDown(v1) - print("AccDown:",v1) - self.Float() - print("Float:",1) + self.Float(1) self.AccDown(v - v1) - print("AccDown:",v - v1) - self.Float() - print("Float:",1) + self.Float(1) def oneWay(self, p:Person): - self.LoadCarrots(12) - print("LoarCarrots:12") - self.LoadGift(p.weightOfGift) - print("LoarGift:",p.weightOfGift) - v = self.nowSpeedLimit() - if isinstance(p.x_position/v,int) and p.x_position > 0: - t = p.x_position/v - self.AccRight(v) - print("AccRight:",v) - self.Float(t) - print("Float:",t) - self.AccLeft(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) + if self.timeLimit >0: + self.LoadCarrots(12) + print("LoarCarrots:12") + self.LoadGift(p.weightOfGift) + print("LoarGift:",p.weightOfGift) + v = self.nowSpeedLimit() + if isinstance(p.x_position/v,int) and p.x_position > 0 : + t = p.x_position/v + self.AccRight(v) + self.Float(t) + self.AccLeft(v) + self.Float(1) - self.kidoneWay(p.y_position,p) + self.kidoneWay(p.y_position,p) - t = p.x_position/v - self.AccLeft(v) - print("AccLeft:",v) - self.Float(t) - print("Float:",t) - self.AccRight(v) - print("AccRight:",v) - self.Float() - print("Float:",1) + t = p.x_position/v + self.AccLeft(v) + self.Float(t) + self.AccRight(v) + self.Float() - elif isinstance(p.x_position/v,int) and p.x_position < 0: - t = abs(p.x_position)/v - self.AccLeft(v) - print("AccLeft:",v) - self.Float(t) - print("Float:",t) - self.AccRight(v) - print("AccRight:",v) - self.Float() - print("Float:",1) + elif isinstance(p.x_position/v,int) and p.x_position < 0: + t = abs(p.x_position)/v + self.AccLeft(v) + self.Float(t) + self.AccRight(v) + self.Float(1) + + self.kidoneWay(p.y_position,p) + + t = abs(p.x_position)/v + self.AccRight(v) + self.Float(t) + self.AccLeft(v) + self.Float(1) + + elif p.x_position < v and p.x_position > 0 : + v = p.x_position + self.AccRight(v) + self.Float(1) + self.AccLeft(v) + self.Float(1) + + self.kidoneWay(p.y_position,p) + + v = p.x_position + self.AccLeft(v) + self.Float(1) + self.AccRight(v) + self.Float(1) - self.kidoneWay(p.y_position,p) + elif abs(p.x_position) < v and p.x_position < 0 : + v = abs(p.x_position) + self.AccLeft(v) + self.Float(1) + self.AccRight(v) + self.Float(1) - t = abs(p.x_position)/v - self.AccRight(v) - print("AccRight:",v) - self.Float(t) - print("Float:",t) - self.AccLeft(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) - - elif p.x_position < v and p.x_position > 0: - v = p.x_position - self.AccRight(v) - print("AccRight:",v) - self.Float() - print("Float:",1) - self.AccLeft(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) + self.kidoneWay(p.y_position,p) - self.kidoneWay(p.y_position,p) + v = p.x_position + self.AccRight(v) + self.Float(1) + self.AccLeft(v) + self.Float(1) - v = p.x_position - self.AccLeft(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) - self.AccRight(v) - print("AccRight:",v) - self.Float() - print("Float:",1) - - elif abs(p.x_position) < v and p.x_position < 0: - v = abs(p.x_position) - self.AccLeft(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) - self.AccRight(v) - print("AccRight:",v) - self.Float() - print("Float:",1) + elif p.x_position > v and p.x_position > 0 : + t = p.x_position//v + v1 = v - (p.x_position - t*v) + self.AccRight(v) + self.Float(t) + self.AccLeft(v1) + self.Float(1) + self.AccLeft(v - v1) + self.Float(1) - self.kidoneWay(p.y_position,p) + self.kidoneWay(p.y_position,p) - v = p.x_position - self.AccRight(v) - print("AccRight:",v) - self.Float() - print("Float:",1) - self.AccLeft(v) - print("AccLeft:",v) - self.Float() - print("Float:",1) + t = p.x_position//v + v1 = v - (p.x_position - t*v) + self.AccLeft(v) + self.Float(t) + self.AccRight(v1) + self.Float(1) + self.AccRight(v - v1) + self.Float(1) - elif p.x_position > v and p.x_position > 0: - t = p.x_position//v - v1 = v - (p.x_position - t*v) - self.AccRight(v) - print("AccRight:",v) - self.Float(t) - print("Float:",t) - self.AccLeft(v1) - print("AccLeft:",v1) - self.Float() - print("Float:",1) - self.AccLeft(v - v1) - print("AccLeft:",v - v1) - self.Float() - print("Float:",1) + elif abs(p.x_position) > v and p.x_position < 0 : + t = abs(p.x_position)//v + v1 = v - (abs(p.x_position) - t*v) + self.AccLeft(v) + self.Float(t) + self.AccRight(v1) + self.Float(1) + self.AccRight(v - v1) + self.Float(1) - self.kidoneWay(p.y_position,p) + self.kidoneWay(p.y_position,p) - t = p.x_position//v - v1 = v - (p.x_position - t*v) - self.AccLeft(v) - print("AccLeft:",v) - self.Float(t) - print("Float:",t) - self.AccRight(v1) - print("AccRight:",v1) - self.Float() - print("Float:",1) - self.AccRight(v - v1) - print("AccRight:",v - v1) - self.Float() - print("Float:",1) - - elif abs(p.x_position) > v and p.x_position < 0: - t = abs(p.x_position)//v - v1 = v - (abs(p.x_position) - t*v) - self.AccLeft(v) - print("AccLeft:",v) - self.Float(t) - print("Float:",t) - self.AccRight(v1) - print("AccRight:",v1) - self.Float() - print("Float:",1) - self.AccRight(v - v1) - print("AccRight:",v - v1) - self.Float() - print("Float:",1) - - self.kidoneWay(p.y_position,p) - - t = abs(p.x_position)//v - v1 = v - (abs(p.x_position) - t*v) - self.AccRight(v) - print("AccRight:",v) - self.Float(t) - print("Float:",t) - self.AccLeft(v1) - print("AccLeft:",v1) - self.Float() - print("Float:",1) - self.AccLeft(v - v1) - print("AccLeft:",v - v1) - self.Float() - print("Float:",1) - else: - self.kidoneWay(p.y_position,p) + t = abs(p.x_position)//v + v1 = v - (abs(p.x_position) - t*v) + self.AccRight(v) + self.Float(t) + self.AccLeft(v1) + self.Float(1) + self.AccLeft(v - v1) + self.Float(1) + elif p.x_position == 0 : + self.kidoneWay(p.y_position,p) + print("Get score:",Score) s = Santa() +s.speedLimitTable + pp = People() -s.oneWay(pp.info[2]) +pp.info[0] pp.visualization() -s.LoadGift(10) +s.generateTableauDeDistribution(pp) + +for i in s.generateTableauDeDistribution(pp): + s.oneWay(i) + +s.getSituation() + +Score -pp.info[2].getPosition() \ No newline at end of file