描述
题解
算法思想上就是一到十分简单的贪心……但是还是要为它点个赞~(≧▽≦)/~
因为我这种英语渣渣猛一看,以为是01背包/(ㄒoㄒ)/~~还好苦海无涯,我回头是岸,发现原来每个屋子里的咖啡豆量是可以分割的,所以直接求出每个房间的咖啡豆的性价比即可,然后排序贪心,然而,搞到这里,这么简单个题,我还是WA了,这也是我点赞的原因——卡精度了。题目最后要求输出的结果保留三位小数,所以我想当然的用了float
型,结果,精度不够,改成double
就AC了。
必须承认,这道题的数据很强很强了~~~第一次遇见卡精度卡到这种程度的(主要还是我太渣,没见识过世面)。
代码
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
struct room
{
int J;
int F;
double value;
} R[MAXN];
bool cmp(room a, room b)
{
return a.value > b.value;
}
int main(int argc, const char * argv[])
{
int M, N;
while (cin >> M >> N && (M != -1 || N != -1))
{
for (int i = 0; i < N; i++)
{
cin >> R[i].J >> R[i].F;
R[i].value = R[i].J * 1. / R[i].F;
}
sort(R, R + N, cmp);
double res = 0;
for (int i = 0; i < N; i++)
{
if (R[i].F <= M)
{
res += R[i].J;
M -= R[i].F;
}
else
{
res += R[i].value * M;
break;
}
}
printf("%.3lf\n", res);
}
return 0;
}