悼念512汶川大地震遇难同胞

来源:互联网 发布:go语言编程 pdf 编辑:程序博客网 时间:2024/05/16 03:05
Problem Description

对于幸存的灾民来说,最急待解决的显然是温饱问题,救灾部队一边在组织人员全力打通交通,一边在组织采购粮食。现在假设下拨了一定数量的救灾经费要去市场采购大米(散装)。如果市场有m种大米,各种大米的单价和重量已知,请问,为了满足更多灾民的需求,最多能采购多少重量的大米呢?

Input

输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(0 < n <= 1000, 0 < m <= 1000 ),分别表示经费的金额和大米的种类,然后是m行数据,每行包含2个整数p和h(1 <= p <= 25,1 <= h <= 100),分别表示单价和对应大米的重量。
Output

对于每组测试数据,请输出能够购买大米的最多重量(你可以假设经费买不光所有的大米)。
每个实例的输出占一行,保留2位小数。
Example Input

1
7 2
3 3
4 4
Example Output

2.33



思路:结构体数组保存大米的单价和重量,对大米的单价进行升序排列

从第一种开始大米判断能不能买完,能买完就继续判断并计算出花费的钱pi,此时pi<=n,不能买完用剩下的钱(n-pi)除以下一种大米的单价,看一看能买几斤


#include<stdio.h>struct node{    int p;    int w;}a[1001];void qsort(struct node a[],int l,int r){    int i = l,j = r;    struct node key = a[l];    if(i>j)        return;    while(i<j)    {        while(i<j&&a[j].p>=key.p)            j--;        a[i] = a[j];        while(i<j&&a[i].p<=key.p)            i++;        a[j] = a[i];    }    a[i] = key;    qsort(a,l,i-1);    qsort(a,i+1,r);}int main(){    int t,pi,m,n,i;    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&n,&m);    for(i=0;i<m;i++)    {        scanf("%d %d",&a[i].p,&a[i].w);    }    qsort(a,0,m-1);    pi = 0;    double wi = 0;    i = 0;    while(i<m&&pi+a[i].p*a[i].w<=n)    {        pi = pi + a[i].p*a[i].w;        wi = wi + a[i].w;        i++;    }    if(pi<n)    {        wi = wi +(n-pi)*1.0/a[i].p;    }    printf("%.2lf\n",wi);    }}


原创粉丝点击