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;
}