翻译很皮。
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);
}
}
}