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;
}