水题 第二站 FatMouse' Trade

来源:互联网 发布:淘宝登录拖动滑块验证 编辑:程序博客网 时间:2024/05/18 03:45

一个很简单的贪心问题,但是很久没做了,一直怀疑是不是背包问题。
由于涉及到小数精度问题,还是有很多小细节需要注意的
结合代码来说

#include <iostream>#include <stdio.h>#include <math.h>#include <algorithm>#include <string.h>using namespace std;struct node{    double j, f;//将j,f设置为int或double对最后的结果的精度有影        //响,为什么呢?不知道    double w;}a[1010];bool cmp(node p, node q)//这里还加了struct,毕竟很久不写了{    return p.w>q.w;}int main (){    int m, n;    double sum;    while(~scanf("%d %d",&m,&n))    {        if(m==-1&&n==-1)break;        for(int i=0; i<n; i++)        {            scanf("%lf %lf",&a[i].j,&a[i].f);            a[i].w=(double)a[i].j/a[i].f;//double类型转换,            //此处不加也没有影响        }        sort(a,a+n,cmp);        sum=0;        for(int i=0; i<n; i++)        {            if(m>=a[i].f)            {                m = m-a[i].f;                sum+=a[i].j;            }            else            {                sum+=m*(a[i].j/a[i].f);//这里也涉及到小数精度                break;//刚开始写的m=0.==!            }        }        printf("%.3lf\n",sum);    }    return 0;}

从现在开始练习简单的数据结构和算法的题目了。
不明白为什么double类型的相除和int类型的相除结果转化为double,得到的结果是不一样的。
附简单的double和int的区别
int 和 double 都是基本数据类型, int 是整形, double 是浮点型。
一般来说 , int 型变量占用的存储空间和机器字一样大,即 32位系统中是 4个字节; 64位系统中是 8个字节; 而 double 型变量 一般占用8字节,double 型变量占用的存储空间不会小于 int 型变量。
double 型表示的值范围要比 int 表示的值范围大,且从 double 值转换到 int 值,会进行四舍五入,从而有精度损失。
结论,涉及精度问题最好用double类型。

原创粉丝点击