Şimdi Ara

Kazık bir soru (2. sayfa)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
22
Cevap
2
Favori
1.226
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: önceki 12
Sayfaya Git
Git
Giriş
Mesaj
  • seyfi84 S kullanıcısına yanıt
    noktanın noktaya göre döndürmesi yapınca çıkıyor, karenin tam ortasınıa göre saat yönünde 90 döndürme işlemini yapınca direkt bu formül çıkıyor
    attığım linki yeniledim, #açıklama- soru yazdım, hızlanabileceğini düşündüğüm yeri yazdım, onları yapmanın yolu var mı
    teşekkürler



    < Bu mesaj bu kişi tarafından değiştirildi alimmm78 -- 8 Mayıs 2018; 20:3:36 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • seyfi84 S kullanıcısına yanıt
    Ben de bir cevap yazayım.

    Öncelikle çok zor bir soru. 80 puanlık :)
    3. test case'i ben de indirdim. Dediğiniz gibi 3M x 3M'luk bir matris söz konusu. Bunu memory'ye alıp çevirmek matris memory'ye sığmayacağı için olanaklı değil. Bu çözüm verilen test case'le beraber eleniyor.

    Benim çözümüm her knight için, her çevirmeden sonra için knight'ın yerini yeniden bulmak ve her dönüşte sadece knight'ın yerini olması gereken yere güncelleyerek devam etmek. Bu şekilde yapınca karmaşıklığı O(S * L)'ye inmiş oluyor. Yani 200.000 döndürme işlemi ve 200.000 aranan knight varsa 40 milyar işlem yapmak gerekiyor. Uçuk çözümlere gitmeden yapılabileceklerden en iyisi bu diye görünüyor bana.

    Sonunda dayanamayıp çözüme de baktım. Editorial kısmında çözüm var.
    Burada çözümü paylaşıp herkesin keyfini kaçırmayacağım tabii ama çok da akla gelebilecek cinsden görünmedi bana. Bir tek çözüme devam edenler için bir detay paylaşayım (çünkü ben görememiştim) çevirme işlemleri sırasında her kare bir öncekinin içinde yer almak zorunda. Sonraki çevirme işlemleri öncekilerin dışına taşmıyor. Bu detay belki bazılarına bir fikir verebilir.

    Son durumda test case'leri geçmese de 3. case'i 10 dakikadan kısa bir sürede tamamlayan kendi çözümümü de paylaşayım. Kodlar java. 3. case'i de dosyadan okuyorum çünkü konsoldan vermeye çalışınca patlıyor.

     
    package com.company;

    import java.io.*;
    import java.math.*;
    import java.text.*;
    import java.util.*;
    import java.util.regex.*;

    public class Solution {

    /*
    * Complete the kingRichardKnights function below.
    */
    static long[][] kingRichardKnights(long n, long s, long[][] commands, long[] knights) {

    long[][] result = new long[knights.length][2];

    long millis = System.currentTimeMillis();

    for (int j = 0; j < knights.length; j++) {
    long knight = knights[j];
    // System.out.println("Knight: " + knights[j]);
    for (int i = 0; i < commands.length; i++) {
    long[] command = commands[i];

    boolean commandEffectsKnight = commandEffectsKnight(n, command, knight);
    // System.out.println("command: " + command[0] + " " + command[1] + " " + command[2] + " --> " + commandEffectsKnight);

    if (commandEffectsKnight) {
    knight = getNewKnightPosition(n, command, knight);
    // System.out.println("New position: " + knight);
    } else {
    break;
    }
    }
    result[j] = getKnightLoc(knight, n);

    if (j % 1000 == 0)
    System.out.println(j);
    }

    System.out.println("Time: " + (System.currentTimeMillis() - millis));

    return result;

    }

    private static boolean commandEffectsKnight(long n, long[] command, long knight) {

    long knightLeft = (int) ((knight % n) + 1);
    long knightTop = (int) ((knight / n) + 1);

    long rectTop = command[0];
    long rectLeft = command[1];
    long rectWidth = command[2];

    if (rectWidth == 0)
    return false;

    if (knightLeft >= rectLeft && knightTop >= rectTop
    && knightLeft <= rectLeft + rectWidth && knightTop <= rectTop + rectWidth)
    return true;
    else
    return false;
    }

    private static long getNewKnightPosition(long n, long[] command, long knight) {
    long knightLeft = (knight % n) + 1;
    long knightTop = (knight / n) + 1;

    long rectTop = command[0];
    long rectLeft = command[1];
    long rectWidth = command[2];

    long newKnightTop = knightLeft - rectLeft + rectTop;
    long newKnightLeft = rectTop + rectWidth - knightTop + rectLeft;

    return (newKnightTop - 1) * n + (newKnightLeft - 1);
    }

    private static long[] getKnightLoc(long knight, long n) {
    long knightLeft = (knight % n) + 1;
    long knightTop = (knight / n) + 1;

    return new long[]{knightTop, knightLeft};
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
    // BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

    BufferedReader reader = new BufferedReader(new FileReader(new File("c:\\Users\\.aykut\\Desktop\\test.txt")));

    long n = Integer.parseInt(reader.readLine());

    int s = Integer.parseInt(reader.readLine());

    long[][] commands = new long[s][3];

    for (int commandsRowItr = 0; commandsRowItr < s; commandsRowItr++) {
    String[] commandsRowItems = reader.readLine().split(" ");

    for (int commandsColumnItr = 0; commandsColumnItr < 3; commandsColumnItr++) {
    long commandsItem = Integer.parseInt(commandsRowItems[commandsColumnItr]);
    commands[commandsRowItr][commandsColumnItr] = commandsItem;
    }
    }

    int knightsCount = Integer.parseInt(reader.readLine());

    long[] knights = new long[knightsCount];
    for (int i = 0; i < knightsCount; i++) {
    knights[i] = Long.parseLong(reader.readLine());
    }

    long[][] result = kingRichardKnights(n, s, commands, knights);

    /*for (int resultRowItr = 0; resultRowItr < result.length; resultRowItr++) {
    for (int resultColumnItr = 0; resultColumnItr < result[resultRowItr].length; resultColumnItr++) {
    System.out.print(String.valueOf(result[resultRowItr][resultColumnItr]));

    if (resultColumnItr != result[resultRowItr].length - 1) {
    System.out.print(" ");
    }
    }

    if (resultRowItr != result.length - 1) {
    System.out.println();
    }
    }*/

    System.out.println();

    scanner.close();
    }

    /* public static void main(String[] args) throws IOException {
    // BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

    long n = scanner.nextInt();
    scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])*");

    int s = scanner.nextInt();
    scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])*");

    long[][] commands = new long[s][3];

    for (int commandsRowItr = 0; commandsRowItr < s; commandsRowItr++) {
    String[] commandsRowItems = scanner.nextLine().split(" ");
    scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])*");

    for (int commandsColumnItr = 0; commandsColumnItr < 3; commandsColumnItr++) {
    long commandsItem = Integer.parseInt(commandsRowItems[commandsColumnItr]);
    commands[commandsRowItr][commandsColumnItr] = commandsItem;
    }
    }

    int knightsCount = scanner.nextInt();

    long[] knights = new long[knightsCount];
    for (int i = 0; i < knightsCount; i++) {
    knights[i] = scanner.nextLong();
    }

    long[][] result = kingRichardKnights(n, s, commands, knights);

    for (int resultRowItr = 0; resultRowItr < result.length; resultRowItr++) {
    for (int resultColumnItr = 0; resultColumnItr < result[resultRowItr].length; resultColumnItr++) {
    System.out.print(String.valueOf(result[resultRowItr][resultColumnItr]));

    if (resultColumnItr != result[resultRowItr].length - 1) {
    System.out.print(" ");
    }
    }

    if (resultRowItr != result.length - 1) {
    System.out.println();
    }
    }

    System.out.println();

    scanner.close();
    } */
    }





  • 
Sayfa: önceki 12
Sayfaya Git
Git
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.