Treasure Island (Pase de un libro para las Olimpiadas de Informática-T1225)

Descripción del título
Un día, KID usó un vehículo volador para volar a una isla del tesoro con muchos metales preciosos.

Aunque KID prefiere todo tipo de trabajos con gemas, no rechaza esos metales preciosos, pero solo lleva un bolsillo, y el bolsillo solo puede contener artículos con un peso de w como máximo.

Hay s tipos de metales en la isla, cada uno con un peso diferente, n 1 , n 2 ,…, n s , y el valor total de cada tipo de metal también es diferente, v 1 , v 2 ,…, v s .

KID quería quitar la mayor cantidad de metal posible a la vez y le preguntó cuánto metal podía quitar.

Tenga en cuenta que el metal se puede dividir arbitrariamente y el valor del metal es proporcional a su peso.

Formato de entrada La
primera línea es el número de grupos de datos de prueba k, seguido de k grupos de entrada,
cada grupo de datos de prueba ocupa 3 líneas,

  • La primera línea es un entero positivo w, que representa el límite superior del peso del bolsillo.
  • La segunda línea es un entero positivo s, que indica el tipo de metal.
  • Hay 2 números enteros positivos en la tercera fila, n 1 , v 1 , n 2 , v 2 ,…, n s , v s son el peso total del primer, segundo,…, sth metal respectivamente valor total

El formato de salida es
k líneas, cada línea de salida corresponde a una entrada y la salida debe tener una precisión de 2 decimales.

Ejemplo de entrada
2
50
4
10100 50 30 7 34 87100
10000
5
1 43 ​​43323 35 45 43 54 87 43

Salida de muestra
171,93
508,00

Rango de datos
1 ≤ s ≤ 100
1 ≤ w ≤ 10000
1 ≤ n i ≤ 10000, 1 ≤ v i ≤ 10000


Solución de problemas
Codiciosos:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 110;

int T;
int n, m;

struct thing
{
    
    
	int v, w;
	double x;
}s[N];

bool cmp(thing a, thing b)
{
    
    
	return a.x > b.x;
}

int main()
{
    
    
	cin >> T;
	
	while(T --)
	{
    
    
		cin >> m >> n;
		for (int i = 1; i <= n; i ++)
		{
    
    
		 	cin >> s[i].v >> s[i].w;
		 	s[i].x = 1.0 * s[i].w / s[i].v;
		}
		
		sort(s + 1, s + 1 + n, cmp);
		
		double ans = 0;
		for (int i = 1; i <= n; i ++)
			if(m >= s[i].v)
			{
    
    
				m -= s[i].v;
				ans += s[i].w;
			}
			else
			{
    
    
				ans += s[i].x * m;
				break;
			}
		
		printf("%.2f\n", ans);
	}
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46239370/article/details/113844675
Recomendado
Clasificación