Submission #72942653


Source Code Expand

'''
方針: ランダム
  CHANGEが選ばれる確率: 低(0.01)
  店に行きやすくする // 行先が木の場合、50%で再度行先を決め直す
'''
import random
import time
from collections import defaultdict
from enum import Enum

class IceCream:
    '''
     edges: edges[i]=頂点iから出ている辺とつながってている頂点
     shops_set: 各頂点が店かの判定用
     shops: shops[i][ice]=店iのアイスiceをもっているか(各店のアイスの種類を管理)
      trees: trees[i]= "W"or"R"
      Memo:
       店i=頂点i(i=0,1,...,num_shops-1)
    '''
    def __init__(self, num_points,num_edges,num_shops,edges,points=None):
        self.num_points = num_points 
        self.num_edges = num_edges
        self.num_shops = num_shops
        self.num_tree = num_points - num_shops

        self.edges = edges                          
        self.shops_set = set([i for i in range(num_shops)])
        self.shops = [defaultdict(lambda:False) for _ in range(num_shops)]   
        self.trees = defaultdict(lambda:"W")
        self.points = points
    
    def clear_state(self):
        self.trees = defaultdict(lambda:"W")
        self.shops = [defaultdict(lambda:False) for _ in range(self.num_shops)]  


class ActionType(Enum):
    MOVE = 0
    CHANGE = 1

# MOVEが選ばれる確率p
def random_choice(p: float) -> ActionType:
    return ActionType.MOVE if random.random() < p else ActionType.CHANGE


class Optimizer:
    def __init__(self, seed, num_turns=None):
        self.rand = random.Random(seed)
        self.num_turns = num_turns
    
    def random_act(self, ice):
        actions = []
        prev_point = -1    # 前回の位置
        current_point = 0  # 現在の位置
        current_state = "" # 現在のアイス
        action_type = list(ActionType) 
        score = 0
        move_prob = 0.99 # MOVEが選ばれる確率 
        p = 0.5 
        for t in range(self.num_turns):
            action = random_choice(p=move_prob)
            # 現在位置が店 or 現在位置の木がすでにストロベリーの場合、強制的に「MOVE」にする
            cannot_change = (current_point in ice.shops_set)or(ice.trees[current_point] == "R")
            if(cannot_change):
                action = ActionType.MOVE
            # 店または木に訪れる
            if(action == ActionType.MOVE):
                # 1つ前に訪れた場所には戻れない
                while(1):
                    # 行先を乱数で決定
                    next_point = self.rand.choice(ice.edges[current_point])
                    if(next_point != prev_point):
                      break
                    else:
                      # 行先が店ではない場合、一定確率で再度実行
                      if(not (next_point in ice.shops_set)):
                        if self.rand.random() >= p:
                          continue
                        
                # 店 
                if(next_point in ice.shops_set):
                    # 新しい種類の場合
                    if(not ice.shops[next_point][current_state]):
                        ice.shops[next_point][current_state] = True
                        current_state = ""
                        score += 1
                # 木
                else:
                    current_state += ice.trees[next_point]
                # 更新
                prev_point = current_point
                current_point = next_point
                
            # 木の変更
            elif(action == ActionType.CHANGE):
                ice.trees[current_point] = "R"
                
            # 行動履歴
            tmp = next_point if(action == ActionType.MOVE)  else -1
            actions.append(tmp)
        return actions, score


# 入力
def get_input(seed=22):
    num_points,num_edges,num_shops,num_turns = list(map(int, input().split()))
    # 辺
    edges = defaultdict(list) 
    for i in range(num_edges):
        a,b = list(map(int, input().split()))
        edges[a].append(b)
        edges[b].append(a)
    '''
    # 座標: 不要
    points = defaultdict(lambda:tuple)
    for i in range(N):
        x,y = list(map(int, input().split()))
        points[i] = (x,y)
    '''
    ice_cream = IceCream(num_points=num_points,num_edges=num_edges,num_shops=num_shops,edges=edges)
    opt = Optimizer(num_turns=num_turns,seed=seed)
    return ice_cream, opt

def main():
    start_t = time.time()
    ice_cream, opt = get_input()
    elapsed_time = time.time() - start_t
    
    num_opt = 1      # 探索回数 
    time_per_opt = 0 # 1回あたりの探索時間
    limit_t = 1.75   # 制限時間[sec]
    best_actions,best_score = [],0
    scores = []
    # 制限時間まで探索
    while((elapsed_time + time_per_opt) < limit_t):
        actions, score = opt.random_act(ice=ice_cream)
        ice_cream.clear_state() # 木、店の状態の初期化
        scores.append(score)
        if(best_score < score):
            best_actions = actions
            best_score = score
        # 更新
        if(num_opt == 1):
            time_per_opt = elapsed_time
        num_opt += 1
        elapsed_time = elapsed_time = time.time() - start_t
        
    # 出力
    ave_score = sum(scores) / num_opt
    #print(f"best_score: {best_score}")
    #print(f"ave_score: {ave_score}")
    #print(f"num_opt:{num_opt}")
    #scores.sort()
    #print(scores[:10], scores[-10:])
    for i in range(len(best_actions)):
        #print(f"turn: {i+1}")
        print(best_actions[i])
     
if __name__ == "__main__":
    main()

Submission Info

Submission Time
Task A - Ice Cream Collection
User hiro716
Language Python (PyPy 3.11-v7.3.20)
Score 82333
Code Size 5785 Byte
Status AC
Exec Time 1862 ms
Memory 145336 KiB

Judge Result

Set Name test_ALL
Score / Max Score 82333 / 1500000
Status
AC × 150
Set Name Test Cases
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
Case Name Status Exec Time Memory
test_0000.txt AC 1861 ms 139288 KiB
test_0001.txt AC 1861 ms 139752 KiB
test_0002.txt AC 1860 ms 141248 KiB
test_0003.txt AC 1862 ms 139152 KiB
test_0004.txt AC 1861 ms 138992 KiB
test_0005.txt AC 1861 ms 140168 KiB
test_0006.txt AC 1861 ms 139960 KiB
test_0007.txt AC 1858 ms 140472 KiB
test_0008.txt AC 1856 ms 139836 KiB
test_0009.txt AC 1859 ms 142832 KiB
test_0010.txt AC 1859 ms 140548 KiB
test_0011.txt AC 1859 ms 139400 KiB
test_0012.txt AC 1859 ms 139168 KiB
test_0013.txt AC 1859 ms 139932 KiB
test_0014.txt AC 1858 ms 140408 KiB
test_0015.txt AC 1859 ms 139788 KiB
test_0016.txt AC 1859 ms 140780 KiB
test_0017.txt AC 1861 ms 139696 KiB
test_0018.txt AC 1860 ms 139856 KiB
test_0019.txt AC 1858 ms 140144 KiB
test_0020.txt AC 1860 ms 140580 KiB
test_0021.txt AC 1858 ms 143492 KiB
test_0022.txt AC 1859 ms 140940 KiB
test_0023.txt AC 1858 ms 139584 KiB
test_0024.txt AC 1858 ms 140216 KiB
test_0025.txt AC 1858 ms 141844 KiB
test_0026.txt AC 1858 ms 141576 KiB
test_0027.txt AC 1859 ms 141040 KiB
test_0028.txt AC 1858 ms 139444 KiB
test_0029.txt AC 1858 ms 142384 KiB
test_0030.txt AC 1861 ms 141100 KiB
test_0031.txt AC 1860 ms 141080 KiB
test_0032.txt AC 1858 ms 139700 KiB
test_0033.txt AC 1858 ms 140912 KiB
test_0034.txt AC 1859 ms 141608 KiB
test_0035.txt AC 1859 ms 141068 KiB
test_0036.txt AC 1860 ms 139972 KiB
test_0037.txt AC 1859 ms 140192 KiB
test_0038.txt AC 1857 ms 140392 KiB
test_0039.txt AC 1859 ms 140400 KiB
test_0040.txt AC 1860 ms 143372 KiB
test_0041.txt AC 1860 ms 140620 KiB
test_0042.txt AC 1859 ms 140312 KiB
test_0043.txt AC 1859 ms 139788 KiB
test_0044.txt AC 1859 ms 140104 KiB
test_0045.txt AC 1858 ms 140296 KiB
test_0046.txt AC 1860 ms 143932 KiB
test_0047.txt AC 1862 ms 139660 KiB
test_0048.txt AC 1861 ms 141116 KiB
test_0049.txt AC 1860 ms 140608 KiB
test_0050.txt AC 1859 ms 139816 KiB
test_0051.txt AC 1860 ms 140328 KiB
test_0052.txt AC 1860 ms 139196 KiB
test_0053.txt AC 1858 ms 139676 KiB
test_0054.txt AC 1859 ms 139272 KiB
test_0055.txt AC 1859 ms 138372 KiB
test_0056.txt AC 1858 ms 141516 KiB
test_0057.txt AC 1860 ms 140496 KiB
test_0058.txt AC 1859 ms 139704 KiB
test_0059.txt AC 1859 ms 139152 KiB
test_0060.txt AC 1859 ms 139084 KiB
test_0061.txt AC 1858 ms 143156 KiB
test_0062.txt AC 1859 ms 143108 KiB
test_0063.txt AC 1858 ms 140472 KiB
test_0064.txt AC 1858 ms 139960 KiB
test_0065.txt AC 1857 ms 139944 KiB
test_0066.txt AC 1859 ms 140320 KiB
test_0067.txt AC 1861 ms 140408 KiB
test_0068.txt AC 1860 ms 139440 KiB
test_0069.txt AC 1860 ms 143296 KiB
test_0070.txt AC 1860 ms 139928 KiB
test_0071.txt AC 1860 ms 140276 KiB
test_0072.txt AC 1860 ms 141288 KiB
test_0073.txt AC 1859 ms 142924 KiB
test_0074.txt AC 1859 ms 140820 KiB
test_0075.txt AC 1857 ms 139584 KiB
test_0076.txt AC 1860 ms 140312 KiB
test_0077.txt AC 1860 ms 139660 KiB
test_0078.txt AC 1859 ms 140496 KiB
test_0079.txt AC 1859 ms 139540 KiB
test_0080.txt AC 1860 ms 140912 KiB
test_0081.txt AC 1859 ms 138812 KiB
test_0082.txt AC 1859 ms 143824 KiB
test_0083.txt AC 1859 ms 144196 KiB
test_0084.txt AC 1859 ms 141012 KiB
test_0085.txt AC 1858 ms 140516 KiB
test_0086.txt AC 1859 ms 139528 KiB
test_0087.txt AC 1860 ms 138968 KiB
test_0088.txt AC 1859 ms 140436 KiB
test_0089.txt AC 1860 ms 139672 KiB
test_0090.txt AC 1859 ms 140224 KiB
test_0091.txt AC 1858 ms 143080 KiB
test_0092.txt AC 1861 ms 140740 KiB
test_0093.txt AC 1859 ms 144044 KiB
test_0094.txt AC 1858 ms 142720 KiB
test_0095.txt AC 1860 ms 142968 KiB
test_0096.txt AC 1859 ms 139272 KiB
test_0097.txt AC 1859 ms 139896 KiB
test_0098.txt AC 1860 ms 139208 KiB
test_0099.txt AC 1860 ms 140232 KiB
test_0100.txt AC 1860 ms 143096 KiB
test_0101.txt AC 1858 ms 140168 KiB
test_0102.txt AC 1860 ms 139072 KiB
test_0103.txt AC 1861 ms 142748 KiB
test_0104.txt AC 1857 ms 140840 KiB
test_0105.txt AC 1860 ms 140460 KiB
test_0106.txt AC 1859 ms 140544 KiB
test_0107.txt AC 1858 ms 139316 KiB
test_0108.txt AC 1858 ms 142012 KiB
test_0109.txt AC 1860 ms 141572 KiB
test_0110.txt AC 1858 ms 140116 KiB
test_0111.txt AC 1857 ms 139636 KiB
test_0112.txt AC 1856 ms 139684 KiB
test_0113.txt AC 1859 ms 139448 KiB
test_0114.txt AC 1857 ms 139884 KiB
test_0115.txt AC 1858 ms 140420 KiB
test_0116.txt AC 1858 ms 139660 KiB
test_0117.txt AC 1860 ms 141244 KiB
test_0118.txt AC 1861 ms 142800 KiB
test_0119.txt AC 1860 ms 142376 KiB
test_0120.txt AC 1860 ms 140072 KiB
test_0121.txt AC 1858 ms 143012 KiB
test_0122.txt AC 1857 ms 139724 KiB
test_0123.txt AC 1859 ms 138632 KiB
test_0124.txt AC 1858 ms 140484 KiB
test_0125.txt AC 1860 ms 139792 KiB
test_0126.txt AC 1858 ms 140428 KiB
test_0127.txt AC 1858 ms 138904 KiB
test_0128.txt AC 1858 ms 139816 KiB
test_0129.txt AC 1860 ms 139156 KiB
test_0130.txt AC 1861 ms 137580 KiB
test_0131.txt AC 1859 ms 145336 KiB
test_0132.txt AC 1860 ms 140856 KiB
test_0133.txt AC 1859 ms 140840 KiB
test_0134.txt AC 1857 ms 140324 KiB
test_0135.txt AC 1858 ms 143608 KiB
test_0136.txt AC 1859 ms 140768 KiB
test_0137.txt AC 1859 ms 141000 KiB
test_0138.txt AC 1858 ms 140124 KiB
test_0139.txt AC 1857 ms 140232 KiB
test_0140.txt AC 1859 ms 142956 KiB
test_0141.txt AC 1857 ms 143348 KiB
test_0142.txt AC 1858 ms 140432 KiB
test_0143.txt AC 1858 ms 141584 KiB
test_0144.txt AC 1861 ms 140728 KiB
test_0145.txt AC 1859 ms 142172 KiB
test_0146.txt AC 1857 ms 142248 KiB
test_0147.txt AC 1858 ms 141592 KiB
test_0148.txt AC 1860 ms 139776 KiB
test_0149.txt AC 1859 ms 143700 KiB