田忌競馬: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つの条件が満たされていない場合は、現在最悪の馬と斉王の最高の馬を比べさせます.
田忌競馬の話を聞いたことがあるでしょう.
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();
}
}
}