• OpenJudge 2795 金银岛


    1.链接地址:

    http://bailian.openjudge.cn/practice/2795/

    2.题目:

    总Time Limit:
    3000ms
    Memory Limit:
    65536kB
    Description
    某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1, n2, ... , ns,同时每个种类的金属总的价值也不同,分别为v1,v2, ..., vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。
    Input
    第1行是测试数据的组数k,后面跟着k组输入。

    每组测试数据占3行,第1行是一个正整数w (1 <= w <= 10000),表示口袋承重上限。第2行是一个正整数s (1 <= s <=100),表示金属种类。第3行有2s个正整数,分别为n1, v1, n2, v2, ... , ns, vs分别为第一种,第二种,...,第s种金属的总重量和总价值(1 <= ni <= 10000, 1 <= vi <= 10000)。
    Output
    k行,每行输出对应一个输入。输出应精确到小数点后2位。
    Sample Input
    2
    50
    4
    10 100 50 30 7 34 87 100
    10000
    5
    1 43 43 323 35 45 43 54 87 43
    
    Sample Output
    171.93
    508.00
    

    3.思路:

    贪心问题,主要要注意qsort的时候不能直接相减返回,要注意精度

    4.代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cmath>
     5 
     6 using namespace std;
     7 
     8 struct METAL
     9 {
    10     double price;
    11     int total;
    12     int weight;
    13 };
    14 
    15 int cmp(const void* a,const void *b)
    16 {
    17     METAL metal_a = *((METAL *)a);
    18     METAL metal_b = *((METAL *)b);
    19 
    20     if(metal_b.price > metal_a.price) return 1;
    21     else if(metal_b.price == metal_b.price) return 0;
    22     else return -1;
    23 }
    24 
    25 int main()
    26 {
    27     //freopen("C://input.txt","r",stdin);
    28 
    29     int i;
    30 
    31     int k;
    32     cin >> k;
    33 
    34     while(k--)
    35     {
    36         int w;
    37         int s;
    38         cin >> w >> s;
    39 
    40         METAL *arr_metal = new METAL[s];
    41 
    42 
    43         for(i = 0; i < s; ++i)
    44         {
    45             cin >> arr_metal[i].weight >> arr_metal[i].total;
    46             arr_metal[i].price = arr_metal[i].total * 1.0 / arr_metal[i].weight;
    47         }
    48 
    49         qsort(arr_metal,s,sizeof(METAL),cmp);
    50 
    51         //for(i = 0; i < s; ++i) cout << arr_metal[i].price << " " << arr_metal[i].weight << endl;
    52 
    53         double sum = 0.0;
    54         for(i = 0; i < s; ++i)
    55         {
    56             if(w > arr_metal[i].weight) {sum += arr_metal[i].total;w -= arr_metal[i].weight;}
    57             else {sum += w * arr_metal[i].price; break;}
    58         }
    59         
    60         cout.setf(ios::fixed);
    61         cout.precision(2);
    62         cout << sum << endl;
    63 
    64         delete [] arr_metal;
    65     }
    66 
    67     return 0;
    68 }
  • 相关阅读:
    Account group in ERP and its mapping relationship with CRM partner group
    错误消息Number not in interval XXX when downloading
    错误消息Form of address 0001 not designated for organization
    Algorithm类介绍(core)
    梯度下降与随机梯度下降
    反思
    绘图: matplotlib核心剖析
    ORB
    SIFT
    Harris角点
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3581237.html
Copyright © 2020-2023  润新知