金银岛

来源:互联网 发布:ubuntu一直在登录界面 编辑:程序博客网 时间:2024/04/30 06:18

金银岛
Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Submit Status Practice OpenJ_Bailian 2795

Description

某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n 1, n 2, ... , n s,同时每个种类的金属总的价值也不同,分别为v 1,v 2, ..., v s。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。

Input

第1行是测试数据的组数k,后面跟着k组输入。 

每组测试数据占3行,第1行是一个正整数w (1 <= w <= 10000),表示口袋承重上限。第2行是一个正整数s (1 <= s <=100),表示金属种类。第3行有2s个正整数,分别为n 1, v 1, n 2, v 2, ... , n s, v s分别为第一种,第二种,...,第s种金属的总重量和总价值(1 <= n i <= 10000, 1 <= v i <= 10000)。 

Output

k行,每行输出对应一个输入。输出应精确到小数点后2位。

Sample Input

250410 100 50 30 7 34 87 1001000051 43 43 323 35 45 43 54 87 43

Sample Output

171.93508.00


错误;这题开的结构体应该用double 

用int 不对因为结果要的浮点型,如果在中间由整形转化为浮点型很容易错

WA代码

#include<stdio.h>#include<algorithm>using namespace std;struct node{    int n;    int v;}js[100];bool cmp(node a,node b){    if(b.v/b.n<=a.v/a.n)        return true;    else        return false;}int main(){    int k;    scanf("%d",&k);    while(k--)    {        int w,s;        double y=0;        scanf("%d%d",&w,&s);        for(int i=0;i<s;i++)        {            scanf("%d%d",&js[i].n,&js[i].v);        }        sort(js,js+s,cmp);        /*for(int i=0;i<s;i++)        {            printf("%d %d\n",js[i].n,js[i].v);        }*/        for(int i=0;i<s;i++)        {            if(w>=js[i].n)            {                w-=js[i].n;                y+=1.0*js[i].v;                continue;            }            if(w<js[i].n)            {                y+=(1.0*w*js[i].v)/js[i].n;                 w=0;                 break;            }        }        printf("%.2lf\n",y);    }}

下次记住,直接输入的时候就按浮点型输入了


AC代码

#include<stdio.h>#include<algorithm>using namespace std;struct node{    double n;    double v;}js[200];double cmp(node a,node b){   return a.v/a.n>b.v/b.n;}int main(){    int k;    scanf("%d",&k);    while(k--)    {        int  w,s;        double y=0;        scanf("%d%d",&w,&s);        for(int i=0;i<s;i++)        {            scanf("%lf%lf",&js[i].n,&js[i].v);        }        sort(js,js+s,cmp);        /*for(int i=0;i<s;i++)        {            printf("%lf %lf*\n",js[i].n,js[i].v);        }*/        for(int i=0;i<s;i++)        {            if(w>=js[i].n)            {                w-=js[i].n;                y+=js[i].v;                continue;            }            if(w<js[i].n)            {                y+=(w*js[i].v)/js[i].n;                 w=0;                 break;            }        }        printf("%.2lf\n",y);    }}


0 0
原创粉丝点击