res = 0 for p inrange(m // 5 + 1): # グーを出せる回数分ループ c = (m - p * 5) // 2# チョキの回数を求める g = n - p - c # グーの回数を求める if g < 0: # グーの回数がマイナスの場合パス pass elif p * 5 + c * 2 == m: # 指の合計本数が指定回数と同じ場合 x = min(cnt_g, p) + min(cnt_p, c) + min(cnt_c, g) res = max(res, x)
#--------- 入力例 ---------- m = 4# M日後 # (days)日後に、(reward)の報酬を受け取れる仕事 jobs = [{'days':4, 'reward':3}, {'days':4, 'reward':1}, {'days':2, 'reward':2}] #--------------------------- from heapq import heappush, heappop
# days_reward[v]:days[i] = v となる i に対する reward[i] の集合 days_reward = [[] for _ inrange(m + 1)] for job in jobs: # 報酬の支払いが M 日を超える場合はパス if job['days'] > m: pass else: # データ登録 days_reward[job['days']].append(job['reward'])
res = 0# 報酬の最大値 que = [] # ヒープ
# M - 1 日目から 0 日目へとさかのぼる(days_reward[0]から順に見る) for reward in days_reward: for reward1 in reward: # ヒープは小さい順となるので符号反転して追加 heappush(que, reward1 * -1) if que: x = heappop(que) res -= x
from itertools import combinations_with_replacement #--------- 入力例 ---------- n, m, q = 3, 4, 3 a = [1, 1, 2] b = [3, 2, 3] c = [3, 2, 2] d = [100, 10, 10] #--------------------------- # 添字(a, b)を0始まりにする for i inrange(q): a[i] -= 1 b[i] -= 1
# 数列Aのスコアを算出 defcalc_score(A): score = 0 for ai, bi, ci, di inzip(a, b, c, d): if A[bi] - A [ai] == ci: score += di return score
res = 0# 最大値 # 数列Aを全探索する for A in combinations_with_replacement(range(1, m + 1), n): x = calc_score(A) print(A, x) res = max(res, x) print('------------------') print('解(最大値):', res)
頂点数がN、辺の数がMの有向グラフ G があります。
頂点には 1,2,…,N と番号が振られています。
各 i (1 ≦ i ≦ M) について、i 番目の有向辺は頂点 x_i から y_i へ張られています。
G は有向閉路を含みません。
G の有向パスのうち、最長のものの長さを求めてください。
(有向パスの長さとは、有向パスに含まれる辺の本数のことです。)