临近开学了,大家都忙着收拾行李准备返校,但 I_Love_C 却不为此担心! 因为他的心思全在暑假作业上:目前为止还未开动。
暑假作业是很多张试卷,我们这些从试卷里爬出来的人都知道,卷子上的题目有选择题、填空题、简答题、证明题等。而做选择题的好处就在于工作量很少,但又因为选择题题目都普遍很长。如果有555 张试卷,其中 444 张是选择题,最后一张是填空题,很明显做最后一张所花的时间要比前 444 张长很多。但如果你只做了选择题,虽然工作量很少,但表面上看起来也已经做了 45\frac{4}{5}54 的作业了。
I_Love_C决定就用这样的方法来蒙混过关,他统计出了做完每一张试卷所需的时间以及它做完后能得到的价值(按上面的原理,选择题越多价值当然就越高咯)。
现在就请你帮他安排一下,用他仅剩的一点时间来做最有价值的作业。
输入格式
测试数据包括多组。每组测试数据以两个整数 M,N(1≤M≤20,1≤N≤10000)M,N(1\leq M\leq 20, 1\leq N\leq 10000)M,N(1≤M≤20,1≤N≤10000) 开头,分别表示试卷的数目和 I_Love_C 剩下的时间。接下来有 MMM 行,每行包括两个整数 T,V(1≤T≤N,0<V<10000)T,V(1\leq T\leq N,0<V<10000)T,V(1≤T≤N,0<V<10000),分别表示做完这张试卷所需的时间以及做完后能得到的价值,输入以000\:000 结束。
输出格式
对应每组测试数据输出 I_Love_C 能获得的最大价值。保留小数点 222 位
提示
float 的精度可能不够,你应该使用 double 类型。
样例输入
4 204 105 2210 31 20 0
样例输出
37.00
测试数据
4 10
5 22
10 3
1 2
19 3907
224 5203
744 3612
2645 2626
789 5689
3651 1537
1669 4593
1488 2789
246 6102
1481 6051
2604 8048
2143 8675
3375 1288
434 185
1942 6849
3836 827
2335 5038
956 2569
634 1835
2455 2689
16 9395
847 6241
3153 3205
7195 280
3444 1706
7338 9324
699 878
8383 1751
5769 6198
5392 7680
5204 9613
301 2492
3562 8149
1480 3776
971 8208
1371 2871
3863 6418
28369.33
33331.16
#include <iostream>
#include <cstdio>
#include <ctime>
#include <algorithm>
using namespace std;
struct na
{
double a;
double b;
};
bool comper(const na &a, const na &b)
{
return a.b/a.a>b.b/b.a;
}
int main()
{
na a[21]={0};
double sum=0.0;
int M,N;
while(cin>>M>>N&&(M||N))
{
int i;
int aa,bb;
for(i=0;i<M;i++)
{
scanf("%lf %lf", &a[i].a, &a[i].b);
}
sort(a,a+M,comper);//从按价值除以时间的大到小排序
sum=0;
for(i=0;i<M;i++)
{
if(N-a[i].a>=0)
{
N=N-a[i].a;
sum+=a[i].b;
}
else
{
sum=sum+N*(a[i].b/a[i].a);
break;
}
}
printf("%.2lf\n",sum);
}
return 0;
}