【Hdu 1789】 Haciendo la tarea de nuevo

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)

Descripción del problema
Ignacio acaba de regresar de la escuela desde la 30ª ACM / ICPC. Ahora tiene mucha tarea que hacer. Cada maestro le da una fecha límite para entregar la tarea. Si Ignacio entrega la tarea después de la fecha límite, el maestro reducirá su puntaje de la prueba final. Y ahora suponemos que hacer la tarea de todos siempre lleva un día. Entonces, Ignacio quiere que lo ayudes a organizar el orden de hacer la tarea para minimizar el puntaje reducido.
 

Entrada

La entrada contiene varios casos de prueba. La primera línea de la entrada es un número entero T que es el número de casos de prueba. T casos de prueba siguen.
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

Para cada caso de prueba, debe generar la puntuación reducida total más pequeña, una línea por caso de prueba.
 

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

 
Salida de muestra

0
3
5

 Autor
lcy
 
Fuente

 

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 }
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/huashanqingzhu/p/12686326.html
Recomendado
Clasificación