HDU 1052 田忌赛马

来源:互联网 发布:淘宝如何进入闲鱼 编辑:程序博客网 时间:2024/05/29 09:10

有点意思的贪心问题

乍一看挺简单的,细一想挺有意思的


一开始因为这个情况老WA:

田忌: 10   8   7

皇帝: 11   10 9

当时脑子短路,觉得能平就比,这是错的,比如上述情况,如果10v10,结果1平2负,如果10v9,则是1胜2负,明显第二种好一些


关键在于想明白这几种情况:


  1、田忌头马比皇帝头马快,则赢一场
 
 2、田忌末马比皇帝末马慢,则输一场

 3、田忌头马与皇帝头马相等时:
  
  1>如果田忌末马比皇帝末马快,则赢一场
  
  2>如果田忌末马比皇帝末马慢,则输一场
  
  
  3>如果田忌末马与皇帝末马相等时:
  
  一、如果田忌末马比皇帝头马慢,则输一场
  
  二、否则,平一场


import java.util.Scanner;public class _1052_田忌赛马 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();if (n == 0) {break;}// 田忌int[] sunBin = new int[n];// 皇帝int[] emperor = new int[n];// 输入田忌的马for (int i = 0; i < n; i++) {sunBin[i] = sc.nextInt();}// 输入皇帝的马for (int i = 0; i < n; i++) {emperor[i] = sc.nextInt();}int result = compare(sunBin, emperor);System.out.println(result);}}public static int compare(int[] T, int[] E) {T = sortedArray(T);E = sortedArray(E);int T_B = 0, T_E = T.length - 1, E_B = 0, E_E = E.length - 1;int sum = 0;// 循环直到田忌的头马比皇帝的头马快while (T[T_B] < E[E_B]) {T_E--;E_B++;sum -= 200;if (T_E <= 0)break;}/** * 分情况: *  * 1、田忌头马比皇帝头马快,则赢一场 *  * 2、田忌末马比皇帝末马慢,则输一场 *  *  * 3、田忌头马与皇帝头马相等时: *  * 1>如果田忌末马比皇帝末马快,则赢一场 *  * 2>如果田忌末马比皇帝末马慢,则输一场 *  *  * 3>如果田忌末马与皇帝末马相等时: *  * 一、如果田忌末马比皇帝头马慢,则输一场 *  * 二、否则,平一场 */while (T_B <= T_E) {if (T[T_B] > E[E_B]) {T_B++;E_B++;sum += 200;} else if (T[T_B] < T[E_B]) {T_E--;E_B++;sum -= 200;} else {if (T[T_E] > E[E_E]) {T_E--;E_E--;sum += 200;} else if (T[T_E] < E[E_E]) {T_E--;E_B++;sum -= 200;} else {if (T[T_E] < E[E_B]) {sum -= 200;}T_E--;E_B++;}}}return sum;}public static int[] sortedArray(int[] array) {for (int i = array.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {if (array[j] < array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}return array;}}


原创粉丝点击