信奥赛题库 1225:金银岛

 

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int k;//K次询问 
    cin>>k;//输入 
    for(int x = 1;x<=k;x++){//循环K次 
        int w,s;//称重上限和金属种类 
        cin>>w>>s;//输入 
        double n[s+5];//第i种的总重量 
        double v[s+5];//第i种的总价值 
        double sum = 0;//记录带走的总价值 
        for(int i = 1;i<=s;i++){//循环输入 
            cin>>n[i]>>v[i];
        }
        for(int i = 1;i<s;i++){//冒泡排序排列,确保拿走的是价值最高的 
            for(int j = i+1;j<=s;j++){
                if(v[i]/n[i]<v[j]/n[j]){//总价值和总重量的比进行比较 
                    swap(v[i],v[j]);//交换v[i]和v[j] 
                    swap(n[i],n[j]);//交换n[i]和n[j] 
                }
            }
        }
        int i = 1;//数组下标 
        while(w>0 && i<=s){//结束条件:1.已经装不下物品。2.所有物品已拿完 
            if(w>n[i]){//判断是否能装下 
                sum += v[i];//加上这件物品的总价值 
                w -= n[i];//减去这件物品的总重量,求出剩余空间 
            }else{//不能装下这整件物品 
                sum += w/n[i]*v[i];//对物品进行分割,并保证价值最高 
                w = 0;//已经装不下物品了 
            }
            i++;//下标加一 
        }
        printf("%.2lf\n",sum);//保留2位小数输出 
    }
    return 0;//返回0 
}
posted @ 2024-10-19 16:02  王一行(小号)  阅读(5)  评论(0编辑  收藏  举报