Solució llaminera al problema de programació d'intervals (java)
Greedy Solution Interval Scheduling Problem
Descripció del problema:
Hi ha n treballs, i cada treball comença a l'hora de si i acaba a la vostra hora. Per a cada treball, podeu triar si voleu participar o no. Si decidiu participar, heu de participar en tot el procés des del principi fins al final. A més, el temps per participar en els segments de treball no es pot repetir (fins i tot no es permet la superposició entre els moments inicials i finals). El vostre objectiu és participar en la major quantitat de treball possible, per tant, en quantes tasques podeu participar com a màxim?
1≤n≤100000
1≤si≤ti≤10 ^ 9
Entrada:
Primera línia: n
Segona línia: separada per n espais enters, que representen l'hora d'inici de n treballs
La tercera línia: separada per n espais enters, que representen el temps final de n treballs
Entrada de mostra:
5
Gener 2 4 6 8
3 5 7 10 set
Sortida de mostra:
3
Descripció: seleccioneu el treball 1, 3, 5
Anàlisi d'idees:
En comparació amb el mètode de la força bruta, l'algoritme avariciós millora considerablement la velocitat i la complexitat del temps és nul·la. Podem empaquetar l’hora d’inici i de finalització de cada treball, és a dir, posar-los en una classe i ordenar-los segons la mida de l’hora de finalització (com més primerenca sigui l’hora de finalització, més temps hi ha per fer altres treballs), Amb això s’incrementa el nombre de llocs de treball).
Vegeu els comentaris del codi específicament:
import java.util.Arrays import java.util.Scanner public class Qjdut { //Interval scheduling (greedy calculation) private static class time implements Comparable{ private int st//start time private int et//end time public time(int a,int b)//Constructor { this.et=a this.st=b } @Override //If you want to use sort for sorting, you must rewrite the compareto function public int compareTo(time o) { int x=this.et-o.et if (x==0) { int y=this.st-o.st if (y==0) return 0 else if (y0) return 1 else return -1 } } public static int solve(time[] times) { int cnt=1//Number of records int tet=times[0].et//Record the first earliest end time for (int i=1itet)//Satisfy the conditions, count plus one { cnt++ tet=times[i].et//Update the end value } } return cnt } public static void main(String[] args) { Scanner a=new Scanner(System.in) int n=a.nextInt()//number int []start=new int[n]//start time int []end=new int[n]//End time for (int i=0iL'efecte de l'operació és el següent:
