HDOJ_2187 悼念512汶川大地震遇难同胞——老人是真饿了

HDOJ_2187 悼念512汶川大地震遇难同胞——老人是真饿了

1.题目

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位小数。
Sample Input
1
7 2
3 3
4 4
Sample Output
2.33

2.分析

1.显而易见这是一道贪婪算法题,先购买单价小的大米,买完后在买次小的。
2.算法1.快排.适当改造,符合结构体特点
2.贪婪算法.若rem(剩余的钱)-p/weight>0,则可以买完,跟新rem与sum(购买的粮食总重量)
若<=,令sum+=rem/(float)p,结束循环,以.2f格式输出sum。

3.AC代码

#include <bits/stdc++.h>
using namespace std;
typedef struct date
{
    int p;
    int weight;
}DA;
DA da[1000];
void Sort(int l, int r)
{
    int p,_max,_min,wei;
    if(l>=r)
        return;
    _max=r;_min=l;
    p=da[l].p;
    wei=da[l].weight;
    while(_min<_max)
    {
        if(p==da[_max].p)
            _max--;
        while(_min<_max&&da[_max].p>p)
        {
            _max--;
        }
        if(_min<_max)
        {
            da[_min].p=da[_max].p;
            da[_min].weight=da[_max].weight;
        }
        while(_min<_max&&da[_min].p<p)
        {
            _min++;
        }
	if(_min<_max)
        {
            da[_max].p=da[_min].p;
            da[_max].weight=da[_min].weight;
        }
        if(_min>=_max)
        {
            da[_max].p=p;
            da[_max].weight=wei;
        }
        }
    Sort(l,_min-1);
    Sort(_max+1,r);
    }
int main()
{
    int c,n,m,i,rem;
    float sum;
    cin>>c;
    while(c--)
    {
    cin>>n>>m;
        rem=n;
        sum=0;
        for(i=0;i<m;i++)
        {
            cin>>da[i].p>>da[i].weight;
        }
        Sort(0,m-1);
                for(i=0;i<m;i++)
        {
            if(rem-da[i].p*da[i].weight>0)
            {
                rem=rem-da[i].p*da[i].weight;
                sum+=da[i].weight;
            }
            else
            {
                sum+=(float)rem/(float)da[i].p;
                break;
            }
        }
        printf("%.2f\n",sum);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值