贪心算法之田忌赛马

你一定听过田忌赛马的故事吧?       如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子,输一局,田忌就要输掉200两银子,平局的话不输不赢。   请问田忌最多能赢多少银子?
关于输入: 输入包含多组测试数据,每组测试数据的第一行是一个整数n(1<=n<=1000),表示田忌和齐王都拥有n匹马。接下来一行是n个整数,表示田忌的马的速度,下一行也是n个整数,表示齐王的马的速度。 输入的最后以一个0表示结束。
  关于输出:
     对每组数据,输出一个整数,表示田忌至多可以赢多少银子,如果田忌赢不了,就输出一个负数,表示田忌最少要输多少银子。
  例子输入:
3   92 83 71   95 87 74   2   20 20   20 20   2   20 19   22 18   0
例子输出: 200   0   0
解题思路:      贪心算法。如果当前最好的马可以胜齐王最好的马,那么让这两匹马比一场。如果当前最差的马能胜齐王最差的马,那么让这两匹马比一场。如果上面两个条件都不满足,那么让当前最差的马和齐王最好的马比一场。

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();  
        }  
      
       }
    }  

原文地址:https://www.cnblogs.com/xiaoying1245970347/p/3170383.html