题目:http://acm.hdu.edu.cn/showproblem.php?pid=2187
题意:由很多种价格的大米,在经费一定的情况下,买重量更多的大米,并且题目假设经费买不光所有的大米.
思路:贪心法,先买价格低的,再买价格高的.所以先按照价格递增将大米排序(结构体排序),然后消耗经费,至到经费用完.
C++代码如下
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
struct Rice//大米有价格、重量两个属性
{
int p,h;
};
bool cmp(Rice r1,Rice r2)//用于结构体排序
{
return r1.p < r2.p;
}
int main()
{
int C;
cin >> C;//测试的数据有C组
while(C--)
{
int n,m;
cin >> n >> m;
Rice * r = new Rice[m];
for(int i=0;i<m;i++)
cin >> r[i].p >> r[i].h;//输入大米价格和重量
sort(r,r+m,cmp);//排序
double result = 0.0;//能买到的大米的最大重量,用double
for(int i=0;i<m;i++)
{
if(n==0) break;
if(n>r[i].p * r[i].h)
{
result += r[i].h;
n -= r[i].p * r[i].h;
}
else
{
result += (double)(n) / r[i].p;
break; //经费用完了,退出
}
}
cout << setprecision(2) << fixed << result << endl;//两位小数(#include<iomanip>)
}
return 0;
}