CSES - Koodarit

Ryhmässä AA on nn koodaria ja ryhmässä BB on myös nn koodaria. Tehtäväsi on muodostaa nn paria, joissa molemmissa on koodari ryhmästä AA ja BB. Kunkin koodarin tulee olla tasan yhdessä parissa.

Jokaisella koodarilla on tietty taitotaso, ja parien taitotasojen tulisi olla lähellä toisiaan. Kun parin taitotasot ovat xx ja yy, tästä tulee sakkoa xy|x-y|. Sinun tulee etsiä ratkaisu, jossa sakkojen yhteissumma on mahdollisimman pieni.

Voit olettaa, että nn on enintään 10510^5 ja jokainen taitotaso on kokonaisluku välillä 11091 \dots 10^9. Tavoitteena on, että algoritmin aikavaativuus on O(nlogn)O(n \log n).

Python

Toteuta tiedostoon coders.py funktio find, joka ilmoittaa pienimmän sakkojen yhteissumman.

def find(a,b):
    # TODO

if __name__ == "__main__":
    print(find([1,2,3],[2,5,2])) # 3
    print(find([2],[7])) # 5
    print(find([1,1,1,1],[3,4,3,4])) # 10
    print(find([5,2,9,1,2,4],[8,8,2,3,9,4])) # 11

Java

Toteuta tiedostoon Coders.java metodi find, joka ilmoittaa pienimmän sakkojen yhteissumman.

public class Coders {
    public long find(int[] a, int[] b) {
        // TODO
    }

    public static void main(String[] args) {
        Coders c = new Coders();
        System.out.println(c.find(new int[] {1,2,3}, new int[] {2,5,2})); // 3
        System.out.println(c.find(new int[] {2}, new int[] {7})); // 5
        System.out.println(c.find(new int[] {1,1,1,1}, new int[] {3,4,3,4})); // 10
        System.out.println(c.find(new int[] {5,2,9,1,2,4}, new int[] {8,8,2,3,9,4})); // 11
    }
}