【贪心】【双端队列】HDU1052 Tian Ji -- The Horse Racing 田忌赛马

翻译很皮。

Description

It is common knowledge that 从前有一个很聪明的田鸡,他和一个田鸭玩赛泥煤,比赛的规则是这样的:两个人同时拿出一块泥煤,如果两块泥煤同样大,则不计分;否则,泥煤较大的一方获得胜利,获胜方可以获得200分,同时失败方要扣掉200分。田鸭的泥煤分为大,中,小三种,而田鸡的泥煤只有大,中,小三种。显而易见,田鸭的字体比田鸡的粗,所以田鸭的泥煤也比田鸡的大。虽然看起来田鸭的泥煤都比田鸡的大,但是田鸡用小的泥煤去比田鸭的大泥煤,用大的泥煤去比田鸭的中泥煤,用中的泥煤去比田鸭的小泥煤,最后获得了胜利。

今天,田鸡要和王泥煤比赛泥煤,今天他们各有n块泥煤,假设田鸡今天是天选之人,你能帮忙算算田鸡最多能获得多少分吗??

Input

输入包括多个测试数据,每组测试数据第一行包括一个整数n(1 <= n <= 1000),第二行包括n个整数,表示田鸡的n块泥煤的大小,第三行包括n个整数,表示王泥煤的n块泥煤的大小。

输入将以仅含有数字0的一行代表结束

Output

对于每组测试数据输出一行,给出田鸡最多能获得的分数

Sample Input

3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0

Sample Output

200
0
0

思路

总体思路是能赢则用最小代价去赢(快马比快马,慢马比慢马),否则用己方最小代价地方最大代价输(用最慢的马去输对方最快的马)。

  • 先对田忌和齐王的马分别排序。
  • 如果田忌的快马比齐王的快马快,则比掉。
  • 如果田忌的慢马比齐王的慢马快,则比掉。
  • 否则拿田忌的慢马和齐王的快马比。

代码

数组

import java.util.Arrays;
import java.util.Scanner;

public class HDU1052 {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while (true){
            int N = in.nextInt();
            if(N == 0) break;
            in.nextLine();
            int[] a = new int[N];
            for(int i = 0; i < N; i++){
                a[i] = in.nextInt();
            }
            in.nextLine();

            int[] b = new int[N];
            for(int i = 0; i < N; i++){
                b[i] = in.nextInt();
            }
            in.nextLine();

            Arrays.sort(a);
            Arrays.sort(b);

            
            int i = 0, j = 0, p = N - 1, q = N - 1;
            int res = 0;
            while (i <= p){
                if(a[p] > b[q]){
                    p--;
                    q--;
                    res++;
                }else if(a[i] > b[j]){
                    i++;
                    j++;
                    res++;
                }else{
                    // 如果不能赢还可能能平,这里要注意
                    if(a[i] < b[q]) res--;
                    i++;
                    q--;
                }
            }
            System.out.println(res * 200);
        }
    }
}


双端队列

比数组实现慢了一些些,差别微乎其微,相对来说代码可读性高一些。

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.Scanner;

public class HDU1052Deque {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while (true){
            int N = in.nextInt();
            if(N == 0) break;
            in.nextLine();
            int[] a = new int[N];
            for(int i = 0; i < N; i++){
                a[i] = in.nextInt();
            }
            in.nextLine();

            int[] b = new int[N];
            for(int i = 0; i < N; i++){
                b[i] = in.nextInt();
            }
            in.nextLine();

            Arrays.sort(a);
            Arrays.sort(b);

            Deque<Integer> dequeA = new ArrayDeque<>(N);
            Deque<Integer> dequeB = new ArrayDeque<>(N);
            for(int i = 0; i < N; i++)dequeA.add(a[i]);
            for(int i = 0; i < N; i++)dequeB.add(b[i]);

            int res = 0;
            while (!dequeA.isEmpty()){
                if(dequeA.getLast() > dequeB.getLast()){
                    dequeA.removeLast();
                    dequeB.removeLast();
                    res++;
                }else if(dequeA.getFirst() > dequeB.getFirst()){
                    dequeA.removeFirst();
                    dequeB.removeFirst();
                    res++;
                }else{
                    // 如果不能赢还可能能平,这里要注意
                    if(dequeA.pollFirst() < dequeB.pollLast()) res--;
                }
            }
            System.out.println(res * 200);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/a617976080/article/details/88768237