贪心问题,但要注意一些特殊数据:
尤其是M=0,与F==0时的情况。
0 1
1 0
1.000
1 0
0.000
5 4
10000 5
2000 2
100 0
300 0
10400.000
数据类型用double,就这样
#include <iostream>
尤其是M=0,与F==0时的情况。
0 1
1 0
1.000
1 0
0.000
5 4
10000 5
2000 2
100 0
300 0
10400.000
数据类型用double,就这样
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
struct jf
{
double a;
double b;
double c;
}JF[1005];
int cmp_jf(const void *a,const void *b)
{
if(((jf*)a)->c-((jf*)b)->c>1e-6) return -1;
else return 1;
}
int main()
{
double M,N;
cin>>M>>N;
while(M!=-1||N!=-1)
{
for(int i=0;i<N;i++)
{
cin>>JF.a>>JF.b;
if(JF.b==0) JF.c=999999999;
JF.c=JF.a/JF.b;
}
qsort(JF,N,sizeof(JF[0]),cmp_jf);
double sum=0;
for(int i=0;i<N;i++)
{
if(JF.b==0)
{
sum=sum+JF.a;
}
if(M>1e-6)
{
if(M>=JF.b&&JF.a-JF.c*JF.b>1e-6)
{
M=M-JF.b;
sum=sum+JF.c*JF.b;
// cout<<"sum1:"<<sum<<endl;
}
else if(M>=JF.b&&JF.a-JF.c*JF.b<=1e-6)
{
double B=JF.a/JF.c;
M=M-B;
sum=sum+JF.a;
// cout<<"sum2:"<<sum<<endl;
}
else if(M<JF.b&&JF.a-JF.c*M>=1e-6)
{
sum=sum+JF.c*M;
M=M-M;
// cout<<"sum3:"<<sum<<endl;
}
else if(M<JF.b&&JF.a-JF.c*M<=1e-6)
{
double B=JF.a/JF.c;
M=M-B;
sum=sum+JF.a;
// cout<<"sum4:"<<sum<<endl;
}
}
else break;
}
cout<<fixed<<setiosflags(ios::showpoint)<<setprecision(3)<<sum<<endl;
cin>>M>>N;
}
return 0;
}