Problem:
Problem B War II

第二次ProblemB大戦

R大学の2D好きの人たち (2DRespecters)は，A津大学で開催されるプログラミングの練習合宿に参加する．
この練習合宿では，参加者たちが自作のプログラミング問題を持ち寄り，練習に用いる．
今年は，2DRespectersの面々は手軽に作問できるB問題の作問担当者に立候補したため，B問題担当者の座を争うことになった．

戦いの舞台は，とある自販機である．
この自販機は，90円のジュースを1種類だけ販売しており，お手頃価格で購入できることで有名である．
ただし，自販機には，10円玉と100円玉の2つの硬貨しか投入することができず，釣銭もこれらの硬貨でしか支払われない．

自販機の内部には，10円玉を保存するための10円玉ストレージと，100円玉を保存するための100円玉ストレージが備え付けられており，それぞれには，始めにT枚の10円玉とH枚の100円玉が保存されている．
自販機には，硬貨を一度に一枚しか投入できず，投入された硬貨は，硬貨に対応する内部のストレージに保存される．
自販機の残金表示は，始め0円になっており，硬貨を投入すると，投入した硬貨の金額分，自販機の残金が増加する．
硬貨を投入した結果，自販機の残金が，90円以上になったならば，1本の缶ジュースがジュースの取り出し口に出てくると同時に，自販機の残金から90円を引いた額とちょうど同じ額の硬貨が釣銭として釣銭の取り出し口に出てくる．
このときの釣銭は，内部のストレージにある硬貨で払える範囲で，できるだけ多くの10円玉を用いて支払われる．
釣銭が支払われた後，自販機の残金は0円に戻る．

ただし，この自販機は次の操作を行うと壊れる．

釣銭を払えなくなったとき

10円玉ストレージの保存可能枚数の上限であるL枚を超える10円玉が保存されようとしたとき

自販機の紹介が終わったので，N人の2DRespectersのメンバーが参加したゲームについて説明する．
ゲームの開始時には，2DRespectersのメンバーiはそれぞれ10円玉ti枚と100円玉をhi枚ずつ持っている．
このゲームでは，N人全員が順番に1枚ずつ硬貨を自販機に投入していく．
このとき，メンバー1，メンバー2，....，メンバーNの順で投入する．
N人全員が1枚ずつ硬貨の投入を終えたら，前回と同じ順番で順番に1枚ずつ硬貨の投入を行い，3週目以降も同様である．
硬貨の投入は，10円玉を持っている場合は必ず10円玉を投入し，10円玉を持っていない場合は100円玉を投入するものとする．
メンバーiが硬貨を投入したとき，釣銭の取り出し口に釣銭が出てきた場合は，その全ての釣銭をメンバーiが受け取り，取り出し口に何もない状態にしてから，次のメンバーのターンに移る．

このゲームは，次の条件を最初に満たしたメンバーが勝者となり，B問題の作問担当者となる．

自販機を壊したとき

自分の順番に，硬貨を1枚も持っていないとき

なお，自販機には無限にジュースが保存されており，100円玉ストレージには無限に100円玉を保存することができる．

あなたの仕事は，B問題担当者が誰になったかを求めるものである．

なけなしの硬貨を犠牲に，B問題を賭けた壮絶な戦いが??今，始まる．
ちなみに，購入したジュースはちゃんとB問題担当者が後でおいしくいただきます．

Input

入力は，次の形式で与えられる．

N T H L
t1 h1
t2 h2
...
tN hN

Nは2DRespectersの人数であり，1 <= N <= 100である．
TとHはそれぞれ，10円玉ストレージと100円玉ストレージに最初に保存されている硬貨の枚数であり，0 <= T, H <= 100である．
Lは10円玉ストレージの保存可能枚数の上限であり，T <= L <= 100である．
1 <= i <= Nのとき，tiは，2DRespectersのメンバーiの10円玉の所持枚数を表し，hiは100円玉の所持枚数を表す．0 <= ti, hi <= 100である．

Output

B問題担当者になったメンバーの番号を1行に出力せよ．

Sample Input 1

3 0 0 100
4 0
3 0
3 0

Sample Output 1

2

Sample Input 2

3 0 0 8
4 0
3 0
3 0

Sample Output 2

3

Sample Input 3

3 0 0 100
2 1
3 0
3 0

Sample Output 3

1

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		final int N = sc.nextInt();
		final int T = sc.nextInt();
		final int H = sc.nextInt();
		
		final int L = sc.nextInt();
		
		int[] ts = new int[N];
		int[] hs = new int[N];
		for(int i = 0; i < N; i++){
			ts[i] = sc.nextInt();
			hs[i] = sc.nextInt();
		}
		
		int store_t = T;
		int store_h = H;
		int cur_p = 0;
		
		while(true){
			boolean abort = false;
			int break_number = 0;
			
			for(int i = 0; i < N; i++){
				//System.out.println((i + 1) + " " + cur_p + " " + store_t + " " + store_h);
				
				//no money
				if(ts[i] == 0 && hs[i] == 0){
					abort = true;
					break_number = i;
					break;
				}
				
				//pay
				if(ts[i] > 0){
					ts[i]--;
					store_t++;
					cur_p += 10;
				}else if(hs[i] > 0){
					hs[i]--;
					store_h++;
					cur_p += 100;
				}
				
				//over limit
				if(store_t > L){
					abort = true;
					break_number = i;
					break;
				}
				
				//retrun money
				if(cur_p >= 90){
					final int rest = cur_p - 90;
					
					final int rest_h = rest / 100;
					final int rest_t = (rest % 100) / 10;
					
					final int t_to_h = Math.max((store_t - rest_t) / 10, 0);
					
					final int h_ret = Math.max(rest_h - t_to_h, 0);
					final int t_ret = Math.max(rest_h - h_ret, 0) * 10 + rest_t;
					
					//final int h_ret = rest / 100;
					//final int t_ret = rest % 100;
					
					//not return
					if(h_ret > store_h || t_ret > store_t){
						abort = true;
						break_number = i;
						break;
					}
					
					//System.out.println(cur_p + " : " + store_t + " " + store_h + "=>" + (store_t - t_ret) + " (" + t_ret + "(" + rest_t + ")"+  ")" + " " + (store_h - h_ret) + "(" + h_ret + " : "  + rest_h + ")");
					
					//remove_store
					store_t -= t_ret;
					store_h -= h_ret;
					//return
					ts[i] += t_ret;
					hs[i] += h_ret;
					//cur_p
					cur_p = 0;
				}
			}
			
			if(abort){
				System.out.println(break_number + 1);
				break;
			}
		}
	}
}