import java.util.Arrays;
public class Main {
static double[] a = {20.0, 19.6, 19.2};
static double[] b = {22.454, 22.224, 21, 20.3, 19.9, 19, 18};
static boolean[][] takes;
static double INF = 1000.0;
static double[][] dp;
public static void main
(String[] args
){ dp = new double[a.length][b.length];
takes = new boolean[a.length][b.length];
for(int i=0; i<dp.length; i++){
}
System.
out.
println(maxMatching
(a.
length-1, b.
length-1)); printSolution(a.length-1, b.length-1);
}
static void printSolution(int i, int j){
if(i==-1 || j==-1){
return;
}
if(takes[i][j]){
System.
out.
println(a
[i
] + " " + b
[j
]); printSolution(i-1, j-1);
}else{
printSolution(i, j-1);
}
}
static double maxMatching(int i, int j){
if(i==-1){
return 0;
}
if(j==-1){
return INF;
}
if(dp
[i
][j
] != Double.
MAX_VALUE){ return dp[i][j];
}
double val1 = maxMatching(i, j-1);
double val2
= Math.
abs(a
[i
] - b
[j
]) + maxMatching
(i
-1, j
-1); if(Double.
compare(val1, val2
)>0){ dp[i][j] = val2;
takes[i][j] = true;
}else{
dp[i][j] = val1;
}
return dp[i][j];
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CgpwdWJsaWMgY2xhc3MgTWFpbiB7ICAgICAKICAgIHN0YXRpYyBkb3VibGVbXSBhID0gezIwLjAsIDE5LjYsIDE5LjJ9OwogICAgc3RhdGljIGRvdWJsZVtdIGIgPSB7MjIuNDU0LCAyMi4yMjQsIDIxLCAyMC4zLCAxOS45LCAxOSwgMTh9OwogICAgc3RhdGljIGJvb2xlYW5bXVtdIHRha2VzOwogICAgc3RhdGljIGRvdWJsZSBJTkYgPSAxMDAwLjA7CiAgICBzdGF0aWMgZG91YmxlW11bXSBkcDsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsKICAgICAgICBkcCA9IG5ldyBkb3VibGVbYS5sZW5ndGhdW2IubGVuZ3RoXTsKICAgICAgICB0YWtlcyA9IG5ldyBib29sZWFuW2EubGVuZ3RoXVtiLmxlbmd0aF07CgogICAgICAgIGZvcihpbnQgaT0wOyBpPGRwLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgQXJyYXlzLmZpbGwoZHBbaV0sIERvdWJsZS5NQVhfVkFMVUUpOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWF4TWF0Y2hpbmcoYS5sZW5ndGgtMSwgYi5sZW5ndGgtMSkpOwogICAgICAgIHByaW50U29sdXRpb24oYS5sZW5ndGgtMSwgYi5sZW5ndGgtMSk7CiAgICB9CgogICAgc3RhdGljIHZvaWQgcHJpbnRTb2x1dGlvbihpbnQgaSwgaW50IGopewogICAgICAgIGlmKGk9PS0xIHx8IGo9PS0xKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZih0YWtlc1tpXVtqXSl7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhW2ldICsgIiAiICsgYltqXSk7CiAgICAgICAgICAgIHByaW50U29sdXRpb24oaS0xLCBqLTEpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBwcmludFNvbHV0aW9uKGksIGotMSk7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBkb3VibGUgbWF4TWF0Y2hpbmcoaW50IGksIGludCBqKXsKICAgICAgICBpZihpPT0tMSl7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZihqPT0tMSl7CiAgICAgICAgICAgIHJldHVybiBJTkY7CiAgICAgICAgfQogICAgICAgIGlmKGRwW2ldW2pdICE9IERvdWJsZS5NQVhfVkFMVUUpewogICAgICAgICAgICByZXR1cm4gZHBbaV1bal07CiAgICAgICAgfQogICAgICAgIGRvdWJsZSB2YWwxID0gbWF4TWF0Y2hpbmcoaSwgai0xKTsKICAgICAgICBkb3VibGUgdmFsMiA9IE1hdGguYWJzKGFbaV0gLSBiW2pdKSArIG1heE1hdGNoaW5nKGktMSwgai0xKTsKICAgICAgICBpZihEb3VibGUuY29tcGFyZSh2YWwxLCB2YWwyKT4wKXsKICAgICAgICAgICAgZHBbaV1bal0gPSB2YWwyOwogICAgICAgICAgICB0YWtlc1tpXVtqXSA9IHRydWU7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGRwW2ldW2pdID0gdmFsMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRwW2ldW2pdOwogICAgfQp9