top1编程
← 返回题目
题解

金银岛

1 条题解

  • 0
    @ 2026-7-28 22:45:15
    #include<bits/stdc++.h>
    using namespace std;
    struct jyd{
    	double zl,jz,v;//zl为金属重量,jz为金属价值,v为金属的单位价值 
    }m[105];
    
    bool cmp(jyd a,jyd b){	//按单位价值升序 
    	if(a.v>b.v){
    		return true;
    	}else{
    		return false;
    	}
    }
    int main(){
    	int k;
    	cin>>k;			//k组数据 
    	for(int i=1;i<=k;i++){
    		int w,s;	//w为口袋承重上限,s为金属种类个数 
    		cin>>w>>s;
    		for(int j=1;j<=s;j++){
    			cin>>m[j].zl>>m[j].jz;
    			m[j].v=m[j].jz*1.0/m[j].zl; //计算单位价值 
    		} 
    		sort(m+1,m+s+1,cmp);
    		double t=0;	//总价值 
    		for(int l=1;l<=s;l++){
    			if(m[l].zl<=w){	//如果金属重量小于口袋上限 
    				t+=m[l].jz;	 
    				w-=m[l].zl;//容量减少
    			} 
    			else{
    				t+=m[l].v*w;//乘剩余容量
    				break;
    			}
    		} 
    		cout<<fixed<<setprecision(2)<<t<<endl;
    	}
    	return 0;
    }
    
    • 1