Greedy: para la tarea. c ++

Hay n puestos de trabajo, cada trabajo tiene su propia DDL, si esto no se realiza el trabajo antes de que el DDL, a continuación, el profesor deducir este trabajo todos los puntos habituales. Necesidad de encontrar la forma de organizar el orden de las tareas a ceder un poco menos puntos como sea posible.

Entrada de prueba de la t. La primera línea de entrada es un único entero T, se encontró en el número de casos de prueba.
Cada caso de prueba para comenzar un número entero positivo N (1 <= N <= 1000), indica el número de puestos de trabajo.
A continuación, dos líneas. La primera línea contiene N enteros que representan el DDL, la siguiente fila que contiene N números enteros que representan puntos de la hebilla.

Para cada caso de prueba, la salida debe disminuir la puntuación mínima total, cada línea de la prueba.

de 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 la muestra:
0
3
5

ideas:

  • Queremos obtener la solución óptima y ¿qué pasa? ddl y decenas de puestos de trabajo en el trabajo. Por lo tanto, elegir crear una matriz de estructuras, incluyendo las puntuaciones y ddl dos elementos.
  • Para obtener la solución óptima, debemos primero considerar una gran proporción de las puntuaciones, de acuerdo con la primera fracción están dispuestas, una gran fracción de la primera; a continuación, ordenados por fecha, primera fecha menos.
  • Se puede utilizar una matriz para registrar si la fecha está ocupada, si ese día no está ocupada, se puede hacer, si están ocupados, y reenviarla a seguir para juzgar un día de antelación. Si no se hace con las puntuaciones fecha será añadido a responder el mismo día, la salida final
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath> 
#include<iostream>
using namespace std;
struct grade
{
	int ddl;
	int score;
};
int com(grade a ,grade b)
{
	if(a.score!=b.score)
	return a.score>b.score;
	else if(a.ddl!=b.ddl)
	return a.ddl<b.ddl;
}
int main()
{
	int t=0;
	int n=0;
	cin>>t;
	while(t--)
	{
		cin>>n;
		int ans=0;
		bool visit[1011]={0};
		grade a[1011];
		for(int i=0;i<n;i++)
		{
			cin>>a[i].ddl;
		}
		for(int i=0;i<n;i++)
		{
			cin>>a[i].score;
		}
		sort(a,a+n,com);
		for(int i=0;i<n;i++)
		{
			bool flag=false;
			if(visit[a[i].ddl]==0)
			visit[a[i].ddl]=1;
			else 
			{
				for(int j=a[i].ddl-1;j>=1;j--)
				{
					if(visit[j]==0)
					{
						flag=1;
						visit[j]=true;
						break;
					}
				}
				if(!flag)
				ans+=a[i].score;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
 } 
Publicado 29 artículos originales · ganado elogios 1 · visitas 944

Supongo que te gusta

Origin blog.csdn.net/qq_44654498/article/details/104907197
Recomendado
Clasificación