注意比较两个代码绿色的部分,WA中先算出性价比W再通过W*N算出整个物体的价值。会有一定的误差;
所以AC中整个物体的价值是单存的。
WA
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 1000 + 10
using namespace std;
struct node
{
double w;
double n;
}num[maxn];
bool cmp(node a,node b)
{
if(a.w > b.w)
return true;
return false;
}
int main()
{
int m,t;
double x;
while(scanf("%d%d",&m, &t))
{
if( m == -1 && t == -1)
break;
double sum = 0;
for( int i = 0; i < t; i++)
{
scanf("%lf%lf",&x, &num[i].n);
num[i].w = x /(num[i].n * 1.000);
}
sort(num , num + t, cmp);
for( int j = 0; j < t; j++)
{
if( m >= num[j].n)
{
sum += num[j].w * num[j].n;
m -= num[j].n;
}
else
{
sum += num[j].w * m;
break;
}
}
printf("%.3lf\n",sum);
}
}
AC
#include <iostream>
#include <stdio.h>#include <string.h>
#include <algorithm>
#define maxn 1000 + 10
using namespace std;
struct node
{
double w;
double n;
double get;
}num[maxn];
bool cmp(node a,node b)
{
if(a.w > b.w)
return true;
return false;
}
int main()
{
int m,t;
double x;
while(scanf("%d%d",&m, &t))
{
if( m == -1 && t == -1)
break;
double sum = 0;
for( int i = 0; i < t; i++)
{
scanf("%lf%lf",&num[i].get, &num[i].n);
num[i].w = num[i].get /(num[i].n * 1.000);
}
sort(num , num + t, cmp);
for( int j = 0; j < t; j++)
{
if( m >= num[j].n)
{
sum += num[j].get;
m -= num[j].n;
}
else
{
sum += num[j].w * m;
break;
}
}
printf("%.3lf\n",sum);
}
}