# n個の要素を0 ~ n - 1のインデックスで管理する classUnionFind(): def__init__(self, n): self.n = n # 要素の数 self.parents = [-1] * n # 各要素の親要素の番号を格納するリスト
deffind(self, x): # 要素[x]が属するグループの親を返す if self.parents[x] < 0: return x else: self.parents[x] = self.find(self.parents[x]) return self.parents[x]
defunion(self, x, y): # 要素[x]が属するグループと要素yが属するグループとを併合 x = self.find(x) y = self.find(y) if x == y: return if self.parents[x] > self.parents[y]: x, y = y, x self.parents[x] += self.parents[y] self.parents[y] = x
ある工場では製品 p と製品 q を製造しています。
製品 p と製品 q を製造するには原料 m と原料 n が必要で、次のような条件となっています。
・製品 p を1kg製造するには原料 m が1kg、原料 n が2kg必要。
・製品 q を1kg製造するには原料 m が3kg、原料 n が1kg必要。
・原料 m の在庫は30kg、原料 n の在庫は40kgあります。
・単位量当たりの利益は、製品 p が1万円、製品 q が2万円です。
この条件で利益を最大にするためには、製品 p と製品 q をそれぞれ何kg製造すればよいでしょうか。
製品 p の製造量を x kg、と製品 q の製造量を y kgとすると以下のように不等号をつかった式にまとめることができます。
#--------入力例1---------------- n = 6 a = [-45,-41,-36,-36,26,-32] b = [-16,30,77,-46,62,45] c = [42,56,-37,-75,-10,-6] d = [22,-27,53,30,-38,-54] #-------------------------------- # リストCとリストDからの取り出し方の組を全部列挙 cd = [c1 + d1 for c1 in c for d1 in d]
cnt = 0 for a1 in a: # リストAを全部列挙 for b1 in b: # リストBを全部列挙 # リストCとリストDからの和がabとなるように取り出す ab = (a1 + b1)*-1 if ab in cd: cnt += 1 print(cnt)
defget_prime(n): if n <= 1: # 1以下の場合 return [] # 空リストを返す prime = [2] # 素数リストを 2 だけで作成 limit = int(math.sqrt(n)) # 検索する上限を設定(nの平方根)
data = [i for i inrange(3, n, 2)] # 奇数のリストを作成 while limit >= data[0]: # 上限≧奇数の先頭の場合 prime.append(data[0]) # 素数リストに奇数の先頭を追加 # 奇数リストのうち、先頭の数で割り切れないものでリストを作成 data = [j for j in data if j % data[0] != 0]
n = len(a) # 配列数 res = n + 1# 最小区間の初期値(配列数+1) s = 0# 集計開始位置 t = 0# 集計最終位置 total = 0# 合計値
whileTrue: while t < n and total < S: # 集計最終位置が配列内かどうか、合計値がSより小さいかどうか total += a[t] # 合計値を算出 t += 1# 集計最終位置を1つうしろにずらす if total < S: break# 合計値が条件(整数S以上)に達していないので終了(集計最終位置が配列を超えた) res = min(res, t - s) # 合計値が条件を満たしている部分列の長さが、より短い場合は更新 total -= a[s] # 合計値から先頭の要素をひく s -= 1# 集計開始位置を1つうしろにずらす
if res > n: # 配列数より大きいので解がなかった res = 0# 解がなかったため0を設定 print(res) # 解を出力