//失败的方法
#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int M,N;
while(cin>>M>>N)
{
if(M==-1 && N==-1)
break;
{ double j[1001];
double f[1001];
double x[1001];
for(int i=0; i<N; i++)
{
cin>>j[i];
cin>>f[i];
}
for(int k=0; k<N; k++) //性价比
{
x[k] = j[k] / f[k];
}
for(int i=0; i<N; i++) //性价比排序
{
for(int k=i+1; k<N; k++)
{
if(x[i]<x[k])
{
double temp = x[i];
x[i] = x[k];
x[k] = temp;
temp = j[i];
j[i] = j[k];
j[k] = temp;
temp = f[i];
f[i] = f[k];
f[k] = temp;
}
}
}
double sum = 0;
for(int i=0; i<N; i++) //循环嵌套效率太低;
{
if(M==0)
break;
for(int k=0; k<f[i]; k++)
{
if(M==0)
break;
sum = sum + x[i];
M--;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl;
}
}
return 0;
}
正确版:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct node
{
double j,f,p; //p是性价比:j/f
}Node[10000];
int cmp(node x,node y)
{
return x.p>y.p;
}
int main(int argc, char** argv) {
int m,n;
while(scanf("%d%d",&n,&m) && (m!=-1||n!=-1))
{
double sum = 0,max = 0;
for(int i=0; i<m; i++)
{
cin>>Node[i].j>>Node[i].f ; // scanf("%lf%lf",&node[i].j,&node[i].f);
Node[i].p = Node[i].j / Node[i].f;
}
sort(Node,Node+m,cmp);
//性价比排完序之后:
for(int i=0; i<m; i++) //猫食的分配是关键
{
if(n>Node[i].f)
{
sum += Node[i].j;
n-=Node[i].f;
}
else
{
sum+=Node[i].p * n;
break;
}
}
printf("%.3lf\n",sum); //控制输出小数位数
}
return 0;
}
啦啦啦