May the force be with you!
posts - 52,  comments - 33,  trackbacks - 0


题目描述:

产品由n个部件组成(n= 100,每个部件有bp 两个属性值,每个部件有m种选择(m=100),总产品的B=min{bi} P=Σ{pi}选择各部件,使得最后产品的B/P值最大。

解题思路:

贪心。思路(来自Discuss)

1,获得一个最小和最大带宽:

    最小带宽是各个设备最小带宽的最大值,

    最大带宽是各个设备最大带宽的最小值.

2,从最小值递增到最大值进行寻找,

计算各种设备价钱的最小值的和,然后计算出一个比值,

如果比值比当前比值大,更换当前比值;

3,重复2直到结束.

/*

for(i=0;i<总共的状态数;i++)

{     for (j=0;j<总的部件数;j++)

       {     for(k=0;k<总的选择;k++)

                     求出满足状态i的,p值最小的部件;

           total+=求出来的p

     }

     比较求出最大的B[i]/ total 的值;

}

*/


 

 1/********************************************************************
 2Author: littlekid
 3Created Time: 2007-11-28
 4Problem Source: POJ1018
 5Description: 
 6********************************************************************/

 7# include <stdio.h>
 8
 9# define N 110
10# define MAX 342289
11
12int b[ N ][ N ],p[ N ][ N ];
13int m[ N ];
14
15int main()
16{
17    int n;
18    int min_b, max_b;
19    int sum_p, min_p;
20    double max;
21    int T; scanf( "%d"&T );
22    while ( T -- )
23    {
24        max_b = 0; min_b = MAX;
25        scanf("%d",&n);
26        forint i = 0; i < n; ++ i)
27        {
28            scanf( "%d"&m[i] );
29            forint j = 0; j < m[ i ]; ++ j )
30            {
31                scanf( "%d %d"&b[ i ][ j ], &p[ i ][ j ] );
32                if ( max_b < b[ i ][ j ] ) max_b = b[ i ][ j ];
33                if ( min_b > b[ i ][ j ] ) min_b = b[ i ][ j ];
34            }

35        }

36        max = 0.00;
37        forint i = min_b; i <= max_b; ++ i)
38        {
39            sum_p = 0;
40            forint j = 0; j < n; ++ j)
41            {
42                min_p = MAX;
43                forint k = 0; k < m[ j ]; ++ k )
44                {
45                    if( b[ j ][ k ] >= i && p[ j ][ k ] < min_p )
46                    {
47                        min_p = p[ j ][ k ];
48                    }

49                }

50                sum_p += min_p;
51            }

52            if( (double)i / (double)sum_p > max ) 
53            {
54                max = (double)i / (double)sum_p;
55            }

56        }

57        printf( "%.3lf\n", max );
58    }

59    return 0;
60}

61
posted on 2007-12-01 23:10 R2 阅读(1500) 评论(3)  编辑 收藏 引用 所属分类: Problem Solving

FeedBack:
# re: POJ1018 Communication System[未登录]
2008-01-27 15:24 | yoyo
在 判断"求出满足状态i的,p值最小的部件" 这里有点疑惑

当B = i时 每组设备不一定是选p值最小的那个啊
因为那样得出的答案不一定B=i ,只能说i肯定比最小值小 必须至少选一个bandwith为i的 这样才符合最小的b是i

所以我觉得需要加一个判断是否有bandwidth为i的设备被选中,但是你这么做就已经AC了,我想的是不是有哪里错了?请麻烦指出 ^^

  回复  更多评论
  
# re: POJ1018 Communication System
2008-02-13 08:42 | R2@whuacm
@yoyo
你优化的想法是对的,我当时并没有用到。
NWERC 2007有个类题(WOJ1303)要用到优化。  回复  更多评论
  
# re: POJ1018 Communication System
2010-03-30 21:40 | karying
你的代码好像有问题,你再看看  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


你是第 free hit counter 位访客




<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(4)

随笔分类(54)

随笔档案(52)

文章档案(1)

ACM/ICPC

技术综合

最新随笔

搜索

  •  

积分与排名

  • 积分 - 62814
  • 排名 - 356

最新评论

阅读排行榜

评论排行榜