超详细题解,正常人都能看懂
2024-10-04 10:50:21
发布于:上海
#include<iostream>
#include<algorithm> //倒库
#include<iomanip>
using namespace std;
const int N=1e5+5;
int t; //表次数的变量
struct Node{ //结构体
int m,v; //m表质量,v表价值
double s; //s是他俩的比值,为sort准备的
}a[N];
bool cmp(Node a,Node b){ //比较函数
return a.s>b.s;
}
int main(){
cin>>t; //输入次数
while(t--){ //整体循环
int w,n; //定义w用于袋子容量,n作为金属数量
double sum=0; //sum是最后的ans
cin>>w>>n;
for(int i=1;i<=n;i++){
cin>>a[i].m>>a[i].v;
a[i].s=a[i].v1.0/a[i].m;//输入每个金属的质量和价值的同时计算单个的价值
}
sort(a+1,a+n+1,cmp);//根据单价排序
for(int i=1;i<=n;i++){ //根据排序后的结果计算ans
if(w==0) break; //退出
if(w<a[i].m){ //如果w不能容纳
sum+=wa[i].s; //由于金属可以随意切割,将w剩下的容量装满
w=0; //清空容量(退出循环)
}else{ //如果w还够容纳当前金属的全部
sum+=a[i].v; //直接加上价值
w-=a[i].m; //w容量自动减少
}
}
cout<<fixed<<setprecision(2)<<sum<<endl; //保留两位小数的输出
}
return 0;
}
这里空空如也
有帮助,赞一个