2016-04-02 13 views
0

bulma:Bir dizinin iki büyük elemanı <a href="http://codeforces.com/contest/659/problem/B" rel="nofollow">Problem</a> için

Bulma ve 0'dan daha büyük puanlarına göre n bölgelerinin (dışarı her bölgeden iki öğrenci (Aksi baskı "?") Benzersiz takımı baskı 800)

En büyük ve ikinci en büyük öğeyi, -1 ve -1 puanlarıyla başlatabileceğimizi düşündük. Sadece birkaç olasılık vardır:

  • skor büyük fazlaysa

    , o zaman büyük güncel olması ve en büyük ikinci büyük aynı ise büyük ikinci büyük ama, takım iki oluşturulabilir geçiş gerekir yollar, bu nedenle tanımlanmamış.
  • Skor ikinci saniyeden fazlaysa, doğrudan onu değiştirin. Böylece skor da

tanımsız Ama bu yanlış görünüyor, ama neden bilmiyorum ikinci aynı ise Else

  • ?

    Kodu:

    import java.util.Arrays; 
    import java.util.Scanner; 
    
    public class B659 { 
        private static Scanner sc = new Scanner(System.in); 
    
        public static void main(String[] args) { 
        int n = num(); 
        int m = num(); 
        String[] rgn1 = new String[m]; // students with highest score in their region 
        String[] rgn2 = new String[m]; // students with second-highest score in their region 
        int[] rgn1s = new int[m]; // highest score in the regions 
        int[] rgn2s = new int[m]; // second-highest score in the regions 
        Arrays.fill(rgn1s, -1); 
        Arrays.fill(rgn2s, -1); 
        boolean[] und = new boolean[m]; 
        for (int i = 0; i < n; i++) { 
         String sn = str(); 
         int r = num() - 1; 
         int sc = num(); 
         if (sc > rgn1s[r]) { 
         if (rgn2s[r] == rgn1s[r] && rgn1s[r] != -1) { 
          und[r] = true; 
          continue; 
         } else { 
          rgn2s[r] = rgn1s[r]; 
          rgn2[r] = rgn1[r]; 
         } 
         rgn1s[r] = sc; 
         rgn1[r] = sn; 
         } else if (sc > rgn2s[r]) { 
         rgn2s[r] = sc; 
         rgn2[r] = sn; 
         } else if (sc == rgn2s[r]) { 
         und[r] = true; 
         } 
        } 
        for (int i = 0; i < m; i++) { 
         print((!und[i]) ? (rgn1[i] + " " + rgn2[i]) : "?"); 
        } 
        } 
    
        private static int num() { 
        return sc.nextInt(); 
        } 
    
        private static String str() { 
        return sc.next(); 
        } 
    
        private static void print(Object x) { 
        System.out.println(x); 
        } 
    } 
    
  • +1

    Sadece iki noktadan ayırın. Profesörünüz verimli olmadığını söylüyorsa, ona erken bir optimizasyonun tüm kötülüklerin kökü olduğunu söyleyin. –

    +0

    @EdPlunkett Biliyorum, ama bu O (nlogn) ve bu da O (n). Tek bir geçişte gidiyoruz ve 3-5 kez – RE60K

    +0

    @EdPlunkett'i karşılaştırabilirsiniz. Aslında – RE60K

    cevap

    1

    yinelenen değerler kez karşılaşıldı ve und[r] alan gerçek set edildiğinde durumun üstesinden gelmez Kodunuz, iki yüksek değerler karşılaşılır.
    örneğin için

    :
    Ram 1 200
    Shyam 1 200
    Raju 2 200
    Rita 1 300
    Hera 2 500
    Sita 1 500

    Son çift olmaları halinde yinelenen girişlerin bir kısmı varsa, yeniden tanımlamanız ve başka bir tane eklemeniz gerekir.
    Ram 1 200
    Shyam 1 300
    Raju 2 200
    Rita 1 500
    Hera 2 500
    Sita 1 500

    : örneğin için

    else if (sc == rgn1s[r]) { 
         und[r] = true; 
         } 
    

    İlgili konular