信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
#include<bits/stdc++.h>
using namespace std;
struct metal{
double n,v,value;//n为金属重量,v为金属价值,value为金属的单位价值
}m[105];
bool cmp(metal a,metal b){ //按单位价值升序
return a.value<b.value;
}
int main(){
int k;
cin>>k; //k组数据
for(int i=0;i<k;i++){
int w,s; //w为口袋承重上限,s为金属种类个数
cin>>w>>s;
for(int j=1;j<=s;j++){
cin>>m[j].n>>m[j].v;
m[j].value=m[j].v/m[j].n; //计算单位价值
}
sort(m+1,m+s+1,cmp);
double t=0; //总价值
for(int k=s;k>=1;k--){
if(m[k].n<=w){ //如果金属重量小于口袋上限
t+=m[k].v;
w-=m[k].n;
}
else{
t+=m[k].value*w;
break;
}
}
printf("%.2lf\n",t);
}
return 0;
}