田忌競馬:POJ 2287(欲張り解法)


POJ 2287問題の説明:
田忌競馬の話を聞いたことがあるでしょう.
3頭の馬が1000頭になると、斉王は依然として彼の馬を優劣の順に出場させ、田忌は任意の順序で彼の競馬を選択することができる.1セット勝って、田忌は200両の銀を得ることができて、1セット負けて、田忌は200両の銀に負けて、引き分けたら負けないで勝つことができません.すみません、田忌は最大いくらの銀に勝つことができますか?
入力について:
入力には複数のテストデータが含まれ、各テストデータの最初の行は整数n(1<=n<=1000)であり、田忌と斉王がn頭の馬を持っていることを示す.次の行はn個の整数で、田忌の馬の速度を表し、次の行もn個の整数で、斉王の馬の速度を表す.入力の最後は0で終わります.
出力について:
各グループのデータに対して、1つの整数を出力して、田忌がせいぜいどれだけの銀に勝つことができるかを示して、もし田忌が勝てないならば、1つの負数を出力して、田忌が少なくともどれだけの銀に負けるかを示します.
例入力:
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
例出力:
200
0
0
問題解決の考え方:
欲張りアルゴリズム.もし今の最高の馬が斉王の最高の馬に勝つことができたら、この2匹の馬を1試合比べさせます.現在最悪の馬が斉王最悪の馬に勝つことができれば、この2頭の馬を1試合比べさせます.上記の2つの条件が満たされていない場合は、現在最悪の馬と斉王の最高の馬を比べさせます.
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
 public class Main{
    public static void main(String args[]){  
        int n, m;  
        List<Integer>  vTian=new ArrayList<Integer>();
        List<Integer>  vQi=new ArrayList<Integer>();
        Scanner in=new Scanner(System.in);

      
        while(true){  
          n=in.nextInt();
          if(n==0) break;

            //      
            for(int i = 0; i < n; ++i)  
            {  
                vTian.add(in.nextInt());  
            }  
            for(int i = 0; i < n; ++i)  
            {  
                 vQi.add(in.nextInt());  
            }  
            //      
            Collections.sort(vTian);  
            Collections.sort(vQi);  
      
            int i=0, j=0, x=n-1, y=n-1,cnt=0;  
            boolean bLast=true;  
      
            while(bLast)      
            {  
                //          
                if(x==i)  
                    bLast=false;  
                  
                if(vTian.get(x) > vQi.get(y))  
                {//                   ,       
                    x--;  
                    y--;  
                    cnt+=200;  
                }  
                else if(vTian.get(i)> vQi.get(j))  
                {//                   ,       
                    i++;  
                    j++;  
                    cnt += 200;  
                }  
                else  
                {//  ,                   
                    if(vTian.get(i) < vQi.get(y))  
                        cnt -= 200;  
                    i++;  
                    y--;  
                }  
            }  
           System.out.println(cnt);
            vTian.clear();  
            vQi.clear();  
        }  
      
       }
    }