站外题求助
  • 板块学术版
  • 楼主qyh17306989667
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/19 21:44
  • 上次更新2025/1/20 09:57:24
查看原帖
站外题求助
1354269
qyh17306989667楼主2025/1/19 21:44

rt

描述

某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1,n2,...,nsn_1, n_2, ... , n_s,同时每个种类的金属总的价值也不同,分别为v1,v2,...,vsv_1,v_2, ..., v_s。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。

输入

第1行是测试数据的组数k,后面跟着k组输入。
每组测试数据占3行,第1行是一个正整数w(1<=w<=10000)w (1 <= w <= 10000),表示口袋承重上限。第2行是一个正整数s(1<=s<=100)s (1 <= s <=100),表示金属种类。第3行有2s2s个正整数,分别为n1,v1,n2,v2,...,ns,vsn1, v_1, n_2, v_2, ... , n_s, v_s分别为第一种,第二种,...,第ss种金属的总重量和总价值(1<=ni<=10000,1<=vi<=10000)(1 <= ni <= 10000, 1 <= vi <= 10000)

输出

kk行,每行输出对应一个输入。输出应精确到小数点后2位。

样例输入

样例输出

171.93 508.00

样例输入 #1

2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43

样例输出 #1

171.93
508.00

my code:

#include <bits/stdc++.h>
using namespace std;
struct pa{
	double z,m,m2;
	void pag(){
		m2=z/m;
	}
}a[105];
int main() {
	double n;
	cin>>n;
	for(int i=1;i<=n;i++){
		double x,d,p=0;
		cin>>d>>x;
		for(int j=1;j<=x;j++){
			cin>>a[j].z>>a[j].m;
			a[j].pag();
		}
		for(int j=x;j>1;j--){
			for(int k=1;k<j;k++){
				if(a[k].m2<a[k+1].m2){
					swap(a[k],a[k+1]);
				}
			}
		}
		for(int j=x;j>=1;j--){
			if(d<a[j].z){
				p+=d*a[j].m2;
				break;
			}else{
				d-=a[j].z;
				p+=a[j].m;
			}
		}
		printf("%.2f\n",p);
	}
	return 0;
} 
2025/1/19 21:44
加载中...