[JAVA] Verwendung der Warteschlange mit Priorität

Ich habe das D-Problem von ABC141 mit einem höllischen Code gelöst

Ich habe gestern Abend den AtCoder Beginner Contest 141 mit höllischem Code beantwortet. Problem

Da ich die Prioritätswarteschlange (Prioritätswarteschlange) nicht kenne, wird sort-> pop-> push-> sort ... wiederholt. Ich habe Gehirnmuskeltechnik angewendet, deshalb bereue ich es

Hintergrund

Eine kurze Erklärung für diejenigen, die die Problemstellung nicht lesen möchten

Probleme wie

Grundlegendes Design in meinem Gehirn

Ist es nicht billiger, wenn Sie diejenigen verwenden, die teuer sind, bis die Gutscheine aufgebraucht sind?

** Gebrauchsanweisung: ** Angenommen, Sie haben drei Gutscheine. Es gibt drei Produkte und die Preise sind wie folgt. 100 Yen, 75 Yen, 40 Yen

Lösung:

  1. Verwenden Sie Gutscheine für 100-Yen-Produkte (100-Yen-> 50-Yen).
  2. Verwenden Sie Gutscheine für 75-Yen-Produkte (75-Yen-> 37-Yen).
  3. Verwenden Sie Gutscheine für 50-Yen-Produkte (50-Yen-> 25-Yen).
  4. Der Gesamtbetrag von 25 Yen, 37 Yen und 40 Yen beträgt ** 102 Yen **, also geben Sie diesen aus

Hölle von hier

Ich glaube nicht, dass es bis zur grundlegenden Designebene falsch war. Ohne die priorisierte Warteschlange beim Aufwachen im Code zu kennen Beschreibung, dass LinkedList + Collections.sort sein Bestes geben wird

Main.java


public static void main(String args[]) {
	FastScanner sc = new FastScanner();
	int n = sc.nextInt();
	int m = sc.nextInt();

	LinkedList<Integer> list = new LinkedList<>();
	for (int i = 0; i < n; i++) {
		list.add(sc.nextInt());
	}

	for (int i = 0; i < m; i++) {
		//Gorilla hier
		Collections.sort(list, Collections.reverseOrder());
		list.add(list.pop() / 2);
	}

	long result = 0;
	for (int x : list) {
		result += x;
	}

	System.out.println(result);
}

Es hat wahrscheinlich gut funktioniert, um den Code zu lösen. Natürlich wurde er TLE und starb.

Was ist vorbei?

Unnötig zu erwähnen, dass der Teil, der jedes Mal sortiert wird, um den Maximalwert zu erhalten, nutzlos ist ... Da die Art der Java-Sammlung eine modifizierte Zusammenführungssortierung verwendet, Unter der Annahme, dass die Anzahl der Produkte N und der Coupon M ist, betragen die Verarbeitungskosten N log (N) × M mal.

PriorityQueue-Klasse, die in solchen Fällen verwendet werden kann

Behebung mithilfe einer Priority Queue-Klasse (PriorityQueue)

How to use PriorityQueue Es ist sehr einfach zu bedienen. Deklarieren Sie die priorityQueue-Klasse und legen Sie sie mit der add-Klasse fest. Referenz mit Peak-Methode (get-like Verhalten), Abruf mit Poll-Methode (pop-like Verhalten)

Main.java


	public static void main(String[] args) {
		Queue<Integer> q = new PriorityQueue<Integer>();
		q.add(1);
		q.add(2);
		q.add(3);
		q.add(4);
		System.out.println(q.poll());//output:1 q:{2,3,4}
		System.out.println(q.peak());//output:2 q:{2,3,4}
		System.out.println(q.poll());//output:2 q:{3,4}
	}

Im obigen Beispiel wird der Mindestwert von 1 abgerufen. (2,3,4 bleiben in der Warteschlange)

Wenn Sie in absteigender Reihenfolge möchten, setzen Sie im Argument des Konstruktors "Collections.reverseOrder ()"

Main.java


	public static void main(String[] args) {
		Queue<Integer> q = new PriorityQueue<Integer>(Collections.reverseOrder());
		q.add(1);
		q.add(2);
		q.add(3);
		q.add(4);
		System.out.println(q.poll());//output:4 q:{3,2,1}
		System.out.println(q.peak());//output:3 q:{3,2,1}
		System.out.println(q.poll());//output:3 q:{2,1}
	}

Senden Sie erneut mit der Prioritätswarteschlange

Main.java


public static void review(String args[]) {

		FastScanner sc = new FastScanner();
		int n = sc.nextInt();
		int m = sc.nextInt();

		Queue<Integer> q = new PriorityQueue<Integer>(Collections.reverseOrder());
		for (int i = 0; i < n; i++) {
			q.add(sc.nextInt());
		}

		for (int i = 0; i < m; i++) {
			q.add(q.poll() / 2);
		}

		long result = 0;
		for (int x : q) {
			result += x;
		}

		System.out.println(result);
	}

Das Ergebnis war ** AC ** </ font>, 179 ms, das sehr schnell verarbeitet wurde.

Recommended Posts

Verwendung der Warteschlange mit Priorität
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Verwendung der Ketten-API
[Rails] Verwendung von Enum
Verwendung von Java Optional
Verwendung von JUnit (Anfänger)
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse
Wie man Big Decimal benutzt
[Java] Verwendung von removeAll ()
Verwendung von String [] args
Verwendung von Rails Join
Verwendung von Java Map
Ruby: Wie man Cookies benutzt
Verwendung von abhängigen :: zerstören
Verwendung von Eclipse Debug_Shell
Verwendung von Apache POI
[Rails] Verwendung der Validierung
Verwendung von Java-Variablen
[Rails] So verwenden Sie authenticate_user!
Verwendung von GC Viewer
Wie man Lombok jetzt benutzt
[Erstellen] Verwendung von JUnit
[Schienen] Verwendung von Scope
Verwendung der link_to-Methode
[Rails] Wie man Edelstein "devise" benutzt
Wie man Lombok im Frühling benutzt
Verwendung von StringBurrer und Arrays.toString.
Verwendung von HttpClient (Get) von Java
Verwendung des Bereichs (JSP & Servlet)