Enlace del título: http://acm.hdu.edu.cn/showproblem.php?pid=1789
Límite de tiempo: 1000/1000 MS (Java / Otros) Límite de memoria: 32768/32768 K (Java / Otros)
Entrada
Cada caso de prueba comienza con un número entero positivo N (1 <= N <= 1000) que indica el número de tareas. Luego siguen 2 líneas. La primera línea contiene N enteros que indican los plazos de los sujetos, y la siguiente línea contiene N enteros que indican las puntuaciones reducidas.
Salida
Entrada de muestra
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
0
3
5
Tema: Hay conjuntos de datos de prueba T. Para cada conjunto de datos de prueba, primero ingrese N para indicar que hay N tarea, luego ingrese una línea de N enteros para indicar el límite de tiempo para completar N tareas, y luego ingrese una línea de N enteros para indicar que el tiempo no está en el límite Los puntos que se deducirán de la finalización de la tarea. Se requiere el puntaje mínimo deducido.
Idea : Se puede resolver mediante una estrategia de algoritmo codicioso: asigne primero la tarea con una puntuación más alta; al mismo tiempo, la asignación de cada tarea debe organizarse lo más lejos posible antes de su fecha límite, de modo que se pueda guardar la fecha anterior y se puedan hacer otros arreglos urgentes. Tarea
Prácticas especificas:
Las puntuaciones se ordenan de mayor a menor, y las puntuaciones iguales se ordenan de la fecha más pequeña a la más grande. Luego, escanee todo el trabajo de acuerdo con el puntaje, de mayor a menor, y programe las tareas para cada tarea: cuando se escanea la tarea de la i-ésima tarea, suponiendo que la fecha límite para la i-ésima tarea es x, entonces, si no se asignan otras tareas el día x, entonces el El día x, la i-ésima tarea está programada; si hay otra tarea programada el día x, busque un día libre desde el día x-1 hasta el primer día para organizar la i-ésima tarea. Si no se encuentra un día libre, no se puede programar la i-ésima tarea. Si se puede programar la i-ésima tarea, entonces se organizará la próxima tarea. Si la i-ésima tarea no se puede programar, se deducirá el puntaje de la i-ésima tarea.
El código específico es el siguiente:
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include < string .h> 5 usando el espacio de nombres std; 6 7 #define maxN 1005 8 9 struct work 10 { 11 int time, score; 12 } funciona [maxN]; 13 bool hecho [maxN]; 14 15 int cmp ( estructura de trabajo a, estructura de trabajo b) 16 { 17 if (a.score! =b.score) 18 return a.score> b.score; // Ordenar por puntuación de mayor a menor 19 más devolver a.time <b.time; // Score es igual, el tiempo de corte se clasifica primero 20 } 21 22 int main () 23 { 24 int T, N, i, ans; 25 int j; 26 scanf ( " % d " , & T); 27 while (T-- ) 28 { 29 scanf ( " % d " , & N); 30 para (i =0 ; i <N; i ++) scanf ( " % d " , y funciona [i] .time); 31 para (i = 0 ; i <N; i ++) scanf ( " % d " , y funciona [i] .score); 32 sort (trabajos, trabajos + N, cmp); 33 34 / * para (i = 0; i <N; i ++) printf ("% d", funciona [i] .score); 35 printf ("\ n"); * / 36 37 ans = 0 ; 38 memset (hecho, falso , sizeof (hecho)); 39 40 para (i = 0 ; i <N;// Escanee todos los trabajos en orden desde el puntaje más pequeño 41 { 42 if (done [works [i] .time] == true ) // Si la fecha límite del i-ésimo trabajo ya está ocupada el día 43 { 44 j = works [ i] .time; 45 while (j> 0 && done [j] == true ) // Nota: El tiempo comienza desde 1, el día 0 no existe, aquí j debe ser mayor que 0 46 j--; // Desde la fecha límite Encuentre un día libre por adelantado para organizar el trabajo 47 si (j> 0 ) // Nota: El tiempo comienza desde 1, el día 0 no existe, aquí j debe ser mayor que 0 48 done [j] = verdadero ; //Si se encuentra un día inactivo, organice la tarea en este día 49 más ans = ans + works [i] .score; // Si no se encuentra un día inactivo, la tarea no puede completarse y se deduce la puntuación correspondiente. 50 } 51 más hecho [funciona [i] .time] = verdadero ; // El trabajo del i-ésimo trabajo no está ocupado el día de la fecha límite, entonces el trabajo está programado en la fecha límite 52 } 53 printf ( " % d \ n " , ans); 54 } 55 devuelve 0 ; 56 }
El siguiente código está tomado de Internet, puede referirse a él: (Código fuente aquí )
1 #include <stdio.h> 2 #include <iostream> 3 #include < string .h> 4 #include <algorithm> 5 usando el espacio de nombres std; 6 struct ss 7 { 8 int time, p; 9 } t [ 100000 ]; 10 int f [ 100000 ]; 11 int cmp ( const ss a, const ss b) 12 { 13 if (ap> bp) 14 return 1 ; 15 más si (ap == bp && a.time < b.time) 16 return 1 ; 17 más 18 devuelven 0 ; 19 } 20 int main () 21 { 22 int text, n; 23 scanf ( " % d " , & texto); 24 while (texto-- ) 25 { 26 scanf ( " % d " , & n); 27 memset (f, 0 , sizeof(F)); 28 int i; 29 para (i = 1 ; i <= n; i ++ ) 30 scanf ( " % d " , & t [i] .time); 31 para (i = 1 ; i <= n; i ++ ) 32 scanf ( " % d " , & t [i] .p); 33 clasificación (t + 1 , t + 1 + n, cmp); 34 int suma = 0 ; 35 para (i = 1 ; i <= n; i ++ ) 36 { 37 para ( int j = t [i] .time; j> = 1 ; j-- ) 38 if (! F [j]) 39 { 40 f [j] = 1 ; 41 descanso ; 42 } 43 if (j == 0 ) 44 suma + = t [i] .p; 45 } 46 printf ( " % d \ n " , suma); 47 } 48 devuelve 0 ; 49 }