J'ai répondu au concours AtCoder Beginner Contest 141 hier soir avec un code infernal. Problème
Parce que je ne connais pas la file d'attente prioritaire (file d'attente prioritaire), il répète tri-> pop-> push-> tri ... J'ai utilisé la technique du muscle cérébral, donc je le regrette
Des problèmes tels que
N'est-ce pas moins cher si vous utilisez ceux avec le prix le plus élevé jusqu'à ce que les coupons soient épuisés?
** Guide d'utilisation: ** Supposons que vous ayez trois coupons. Il existe trois produits et les prix sont les suivants. 100 yens, 75 yens, 40 yens
Solution:
Je ne pense pas que c'était mal jusqu'au niveau de conception de base Sans connaître la file d'attente prioritaire lors du réveil dans le code Description que LinkedList + Collections.sort fera de son mieux
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++) {
		//Gorille ici
		Collections.sort(list, Collections.reverseOrder());
		list.add(list.pop() / 2);
	}
	long result = 0;
	for (int x : list) {
		result += x;
	}
	System.out.println(result);
}
Cela a probablement bien fonctionné pour résoudre le code, Bien sûr, il est devenu TLE et est mort.
Inutile de dire que la partie qui trie à chaque fois pour obtenir la valeur maximale est inutile ... Puisque la sorte de collection java utilise un tri de fusion modifié, En supposant que le nombre de produits est N et que le coupon est M, le coût de traitement est N log (N) × M fois.
Résolu à l'aide d'une classe Priority Queue (PriorityQueue)
How to use PriorityQueue C'est très simple à utiliser. Déclarez la classe priorityQueue et définissez-la avec la classe add, Référence avec la méthode de pointe (comportement de type get), extraction avec la méthode de sondage (comportement de type pop)
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}
	}
Dans l'exemple ci-dessus, la valeur minimale de 1 est récupérée. (2,3,4 restent dans la file d'attente)
Si vous voulez dans l'ordre décroissant, définissez Collections.reverseOrder () dans l'argument du constructeur
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}
	}
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);
	}
Le résultat était ** AC ** </ font>, 179ms, qui a été traité très rapidement.
Recommended Posts