HDU 1009贪心

代码如下。需要说明的是,之前一直WA,发现对这题来说,难点不是贪心,是对浮点数的处理,做题经验不足会导致一直不能AC。在代码第43行,用1.0*m*x[i].a/x[i].b就能AC,但是如果直接用x[i].re*m则会WA。其实计算re只是为了排序,在最后计算结果的时候如果还用这个浮点数就会导致多个浮点误差累积,使误差会更大。而直接用m*x[i].a/x[i].b这样做,由于先算的是整数之间的乘法,然后再算一次除法,那么得到浮点数的误差就只有一次,而不是上一种情况的多次误差累积。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 typedef struct{
 5     int a,b;
 6     float re;
 7 }node;
 8
 9 int cmp(const void* a,const void * b)
10 {
11     return (*(node *)a).re < (*(node *)b).re?1:-1;
12 }
13
14 node x[1005];
15
16 int main()
17 {
18     int m,n,i;
19     float max;
20     while(scanf("%d%d",&m,&n))
21     {
22         if(m==-1 || n==-1)break;
23         max = 0;
24         for(i=0; i<n; i++)
25         {
26             scanf("%d%d",&x[i].a,&x[i].b);
27             if(x[i].b==0)
28                 x[i].re = 10000;
29             else x[i].re = (x[i].a*1.0)/x[i].b;
30
31         }
32         qsort(x,n,sizeof(node),cmp);
33         for(i=0; i<n; i++)
34         {
35             /*printf("%d:%f\n",i,x[i].re);*/
36             if(x[i].b < m)
37             {
38                 max += x[i].a;
39                 m -= x[i].b;
40             }
41             else if(x[i].b > m)
42             {
43                 max += 1.0*m*x[i].a/x[i].b; /*change to m*x[i].re can‘t AC*/
44                 break;
45             }
46             else
47             {
48                 max += x[i].a;
49                 break;
50             }
51         }
52         printf("%.3f\n",max);
53     }
54     return 0;
55 }
时间: 2024-10-10 09:58:45

HDU 1009贪心的相关文章

hdu 1009 贪心基础题

B - 贪心 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse contai

HDU 1009 贪心问题

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 46205 Accepted Submission(s): 15482 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guardin

hdu 1009 贪心入门

Mycode: compile error,i don't know why? #include <iostream> #include<algorithm> #include<cstdio> #define maxn 10005 using namespace std; struct room { int j; int f; double val; }; struct room r[3001]; bool compare(struct room a,struct ro

hdu 1009 贪心

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 51935    Accepted Submission(s): 17434 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats g

【贪心专题】HDU 1009 FatMouse&#39; Trade (贪心选取)

链接:click here~~ 题意:老鼠准备了M磅猫食,准备拿这些猫食跟猫交换自己喜欢的食物.有N个房间,每个房间里面都有食物.你可以得到J[i]单位的食物,但你需要付出F[i]单位的的猫食. 计算M磅猫食可以获得最多食物的重量. [解题思路]贪心算法,求最优解.将J[i]/F[i]的值从大到小排列,每次取最大的,局部最优,达到全局最优,从而获得最大值. 代码: // 贪心策略,优先选择投资最大的房间,每选择一次,交换次数依次减少,最后的次数用于价值最小的 //注意精度转化:1.0*(int

贪心/hdu 1009 FatMouse&#39; Trade

题意 有n种物品,每一种需要不同的消费,现在手里有m块钱,求问最多可以买多少 分析 贪心 把每一种物品的价格算出来,然后sort一下,按照价格从便宜到贵排序,能买多少买多少,买买买! Accepted Code 1 /* 2 PROBLEM:hdu1009 3 AUTHER:Nicole Lam 4 MEMO:贪心 5 */ 6 7 #include<cstdio> 8 #include<algorithm> 9 using namespace std; 10 11 12 stru

HDU 1009 FatMouse&#39; Trade (贪心算法)

题意:就是老鼠要用猫粮换粮食,第i个房间一些东西,要用东西去换,可以不全换.问给定的猫粮最多能换多少粮食. 析:贪心算法.我们先算出来每个房间物品的平均价格是多少,肯定越低越好,并且如果能全换就全换,如果不能, 肯定是最后一次了,就把剩下全部换了,看看能换多少.求和. 代码如下: #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <v

hdu 1009 FatMouse&#39; Trade(贪心)

题目来源:hdu 1009 FatMouse' Trade FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54581 Accepted Submission(s): 18299 Problem Description FatMouse prepared M pounds of cat food, ready

HDU 1009.FatMouse&#39; Trade【贪心算法】【8月16】

FatMouse' Trade Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and req