zoukankan      html  css  js  c++  java
  • 贪心算法之田忌赛马

    你一定听过田忌赛马的故事吧?       如果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();  
            }  
          
           }
        }  
    
    
  • 相关阅读:
    jvm-类加载
    jvm调优
    jdk8与jdk9的共存
    eclipse的插件开发-启动时间
    斐波那契数列算法逐层优化(C++)
    2G.处女座与复读机(C++)
    3I.处女座的约会(C++)
    3D.处女座的训练(C++)
    3E.处女座和小姐姐(C++)
    3C.处女座点名(C++)
  • 原文地址:https://www.cnblogs.com/xiaoying1245970347/p/3170383.html
Copyright © 2011-2022 走看看