Time Limit: 2 sec / Memory Limit: 64 MB
配点
- 満点
- 30
問題文
あなたはプログラミングコンテストに参加している。 このコンテストには問題が N問あり、それぞれの問題はPi\(1≤i≤N)個の部分問題に分割されている。i番目の問題について、j個目の部分問題を解くと、その問題の得点はs_i_jになる。
それぞれの問題では、i番目の部分問題を解くにはi-1番目の部分問題を先に解いておく必要がある。
たとえば、ある問題に3つの部分問題が設定されており、部分点が 3点,6点,10点 と指定されている場合、まず1つめの部分問題を解くと3点が得られ、次に2つめを解くと6点、3つめまでを解くと満点の10点が得られる(部分点が加算されて合計19点になるわけではないことに注意)。
あなたは、簡単に解けそうなところから解こうと考え、配点が小さい部分問題から順に取り組んでいくことにした。 同じ配点の部分問題が複数あった場合は、問題番号が小さいものを先に取り組む。
それぞれの部分問題を解くのに必要な時間t_i_jとコンテスト全体の時間Tが与えられたとき、コンテスト終了までにあなたは何点獲得できるかを求めよ。
コンテスト終了時間と部分問題が解けた時間が同時だった場合、その部分問題も解けたものに含める。
入力形式
入力は以下の形式で与えられる。
N\ T\\ P_1\ P_2\ …\ P_N\\ s_1_1\ s_1_2\ …\ s_1_{P_1}\\ …\\ s_N_1\ s_N_2\ …\ s_N_{P_N}\\ t_1_1\ t_1_2\ …\ t_1_{P_1}\\ …\\ t_N_1\ t_N_2\ …\ t_N_{P_N}
- N:問題数
- T:コンテストの時間
- P_i:i番目の問題の部分問題の数
- s_i_j:i番目の問題でj番目の部分問題までを解いたときのスコア
- t_i_j:i番目の問題でj番目の部分問題を解くのに要する時間
出力形式
得られる点数を出力せよ。
制約
- 1 ≤ N ≤ 20
- 1 ≤ T ≤ 1000
- 1 ≤ P_i ≤ 10
- 1 ≤ s_i_j ≤ 1000, s_i_1< s_i_2< …< s_i_{P_i}
- 1 ≤ t_i_j ≤ 1000
- 入力値はすべて整数である。
入力例 1
3 100 1 2 2 100 15 150 30 200 20 10 30 20 40
出力例 1
280
問題2-1(15点)→問題3-1(30点)→問題1-1(100点)→問題2-2(150点)の順に解く。 問題3-2を解いている間にコンテストが終了する。
100+150+30で280点。
入力例 2
3 120 1 2 2 100 15 150 30 200 20 10 30 20 40
出力例 2
450
時間ちょうどに問題3-2が解ける。
100+150+200で450点。
入力例 3
2 100 2 3 15 100 3 100 200 10 90 5 40 40
出力例 3
18
入力例 4
3 75 1 1 1 250 500 1000 100 300 1000
出力例 4
0
入力例 5
11 300 1 1 2 2 2 3 2 2 2 3 2 30 50 10 60 30 90 20 100 20 40 100 30 110 30 120 40 120 20 40 140 100 150 10 15 10 15 10 20 15 30 15 40 60 40 60 30 50 40 50 10 20 100 100 150
出力例 5
430
この例は Autumn Fest 2012 と同じ配点である。
(もちろん、あなたが実際に Autumn Fest 2012 に取り組むにあたっては、この問題でのルールに従わず好きな順に解いて良い)
Writer: tomerun