Um rund zwei Drittel Punkte zu beheben, bestimmt die Höhe der beiden Punkte, dann gibt ein Drittel der Entfernung, Extrempunkte der konvexen Funktion zu finden.
- Falls
lmid
undrmid
die gleiche Seite des maximalen (minimalen) Wertes: dann wird, da Monotonie müssen beide größer (kleiner) Wert, am besten in der Nähe sein, Fernpunktintervall entspricht , um die nicht den Wert enthält, es kann verworfen werden. - Wenn beide Seiten: Da die meisten Werte in der Mitte des beide, wir eine Reihe auf beiden Seiten geben, wird es nicht die meisten Werte beeinflussen, kann sie verworfen werden.
Beispiel 1: P3382 [template] Trichotomie
Bedeutung der Fragen: ein Drittel Vorlage Fragen, die n-te Extrempunkte in [l, r] Funktion, auf fünf Dezimalstellen finden, um sicherzustellen, dass es eine Antwort ist.
(Diese Frage ist eine sehr interessante Lösung für ein Problem, was zum Teufel ist out, offensichtlich Drei-Punkt-Vorlage, aber warum gibt es eine Menge von großen Brüdern in dem Spaß, PSO, Ableitung + Hälfte, Simulated Annealing Algorithmus, goldene Schnitt Methode, Gradientenabfallsaktualisierung oder vier zu verbinden Grading, so dass Tränen unwissend)
#include <stdio.h> #include <iostream> #include <algorithm> #include <cstring> #include <math.h> #include < String > #include <map> #include <queue> #include <Stapel> # umfassen < set > #include <ctime> #define ll long long #define inf 0x3f3f3f3f const double pi = 3,1415926 ; mit Namespace std; verdoppeln a [ 15 ]; Doppel L, R; Doppel cal ( double x) { /// 计算n次函数在x点的值 Doppel res = 0 ; für ( int i = n; i> = 0 ; i-- ) res + = a [i] * pow (x, i); Rückkehr res; } Int main () { scanf ( " % d% lf lf% " , & n, l, u r); für ( int i = n; i> = 0 ; i-- ) scanf ( " % lf " , & a [i]); Doppel EPS = 0.0000001 ; /// verringern die Fehler die während (FABS (rl ist)> = EPS) { double m = (rl ist ein) / 3. ; /// dritte Abstand Doppel LM = L + m; /// linke Drittel Punkt Doppel RM = RM; /// das rechte dritte Punkt IF (CAL (LM) < CAL (RM)) L = LM, die sonst R & lt = RM; } die printf ( " % .5f \ n- " , L); return 0 ; }
Außerdem weiß ich nicht, warum alle Überstunden Java-Code, den Code genau die gleiche Art und Weise zu kopieren, bitte beraten.
Import java.util . * ; public class Haupt { static double [] a = neue Doppel [15 ]; static int n; statische Doppel eps = 0.0000001 ; public static Leere main (String [] args) { Scanner Scan = neue Scanner (System.in); n = scan.nextInt (); Doppel L = scan.nextDouble (); Doppel r = scan.nextDouble (); für ( inti = n; i> = 0; i-- ) a [i] = scan.nextDouble (); Doppel ans = 0 ; während (Math.abs (rl)> EPS) { double m = (rl) / 3 ; Doppel lm = l + m ;; verdoppeln rm = rm ;; wenn (cal (lm) <= cal (rm)) L = LM; sonst r = rm; } System.out.printf ( "% .5f \ n" , l); } Public static Doppelcal ( double x) { double res = 0 ; für ( int i = n; i> = 0; i-- ) res + = a [i] * Math.pow (x, i); Rückkehr res; } }
Beispiel 2: Cattle-off Trainingsspiel 59C Synthese Ausrüstung
Die Bedeutung der Probleme: es ist ein Stück Material, x und Material y Element b, 2 ein Stück Material und das Material (b) 3 kann mit einem A, 4 mit einem Stück Stoff und einem Material (b) kann ein Teil der Ausrüstung B ausgestattet sein, die meisten tun wollen wie viel Ausrüstung. 1 <= a, b <= 1e9
Denken: Angenommen , ein Element , das aus Geräten A, B ausgestattet min ((x-2a) / 4, y-3a), die Antwort am = a + min ((x -2a) / 4, y-3a). Bigwigs sagte: leicht zu sehen , ist eine konvexe Funktion, dann sucht drei Punkte.
Nach dem Match Frage, Problem dritte Erklärung ist, dass ein Drittel, so können große Bruder Spieltisch der dritte gesehen werden, könnte die Frage viel Erfahrung davon haben getan werden, kommt der Code-Tabelle Funktion spielen können wie große Brüder der gleiche Test.
Pit entdeckt durch Zufall: ein Drittel der dritte, ein Anfänger wie mich gesetzten Bedingungen möchte während Satz von rechts <= 3, nur 3 zusätzlich sein kann, die Zufriedenheit aller . Aber für eine ganze Zahl, Problems Rundung berücksichtigt werden, wenn diese Bedingung zur Verfügung gestellt wird , während, wenn der Richter ein Gleichheitszeichen gegeben und ein Gleichheitszeichen nicht zu dem gleichen Ergebnis führen, den Code ändern kann , um zu überprüfen, detaillierter Blick auf dem Code. Um die Genauigkeit, die endgültigen aus dem l und r die besten etwas Intervall war etwas größer, geht Extremwert zu durchqueren, stetig!
Import - Klassen in java.util . * ; Public class Haupt { // Kuh-off Übung 59C statisches int der X-, Y-, öffentliche statische Leere main (String [] args) { Scanner Scan = new new Scanner (System.in); / * Bonzen er sagte , spielt Tisch, so etwas wirklich ist dabiao (300, 300); dabiao (60, 10); * / int T = scan.nextInt (); der während (T = 0! ) { T - ; X = Scan .nextInt (); Y =scan.nextInt (); int L = 0 ist , R & lt Math.min = (X / 2, Y / 3 ), die während (rl ist eine> = 9.) { // diese Differenz nicht 3 verwenden, mit einem etwas größeren Abschnitt int m = (rl ist ein) / 3. ; int LM = L + m; int RM = RM ; // System.out.printf ( „% D = CAL LM (LM) =% D% RM = D CAL (RM) % D = \ n-“, LM, CAL (LM), RM, CAL (RM)); IF (CAL (LM) <CAL (RM)) // die während Satz rl> = 3 nach dem Gleichheitszeichen zuzüglich ohne der vierte Satz von Daten als falsch. = L LM, die sonst R & lt = RM; } //System.out.printf ( "DR L% = D =% \ n-", L, R & lt); int ANS = 0 ; für ( int I = L; I <= R & lt; i ++) // nur über einem Verriegelungsabschnitt , kann nicht den besten Wert finden, das Intervall nicht mehr als etwa 3, dann Traverse bei aM = Math.max (aM, CAL (I)); System.out.println (aM); } } public static int CAL ( int A) { int RES Math.min = a + ((X-2 * a) / 4 ist , Y * 3-.. a); return RES; } public static Leere dabiao ( int X, int Y) { // big Brother Tisch gesagt spielen // von 0 A den gesamten Ausrüstung machen das Gerät A machen System.out.printf ( "Spieltisch Dy =% =% X D \ n-" , X, Y); für ( int i = 0; I <Math.min (X / 2, Y / 3.); I ++ ) { int B Math.min = ((2 * X-I) / 4 ist , Y * 3-.. I); System.out.printf ( „DB% =% A = % D = SUM D \ n-“, I, B, I + B); } System.out.println (); } }