zoukankan      html  css  js  c++  java
  • Communication System(dp)

    Communication System
    Time Limit: 1000MS Memory Limit: 10000K
    Total Submissions: 25006 Accepted: 8925

    Description
    We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices. For each device, we are free to choose from several manufacturers. Same devices from two manufacturers differ in their maximum bandwidths and prices.
    By overall bandwidth (B) we mean the minimum of the bandwidths of the chosen devices in the communication system and the total price (P) is the sum of the prices of all chosen devices. Our goal is to choose a manufacturer for each device to maximize B/P.

    Input
    The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by the input data for each test case. Each test case starts with a line containing a single integer n (1 ≤ n ≤ 100), the number of devices in the communication system, followed by n lines in the following format: the i-th line (1 ≤ i ≤ n) starts with mi (1 ≤ mi ≤ 100), the number of manufacturers for the i-th device, followed by mi pairs of positive integers in the same line, each indicating the bandwidth and the price of the device respectively, corresponding to a manufacturer.

    Output
    Your program should produce a single line for each test case containing a single number which is the maximum possible B/P for the test case. Round the numbers in the output to 3 digits after decimal point.

    Sample Input

    1 3
    3 100 25 150 35 80 25
    2 120 80 155 40
    2 100 100 120 110

    Sample Output

    0.649

    Source
    Tehran 2002, First Iran Nationwide Internet Programming Contest
    以前做这道题的时候是用的贪心,不太明白,现在用Dp明白了;

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <map>
    #include <algorithm>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    typedef long long LL;
    
    const int MAX = 1e5+10;
    
    int Dp[120][1200];//买i件设备时,最小值为k时的花费
    
    int main()
    {
        int n,T,m,b,p;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            memset(Dp,INF,sizeof(Dp));
            for(int i=0;i<=1200;i++)//当没有一件设备是,自然p为零
            {
                Dp[0][i]=0;
            }
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&m);
                for(int j=1;j<=m;j++)
                {
                    scanf("%d %d",&b,&p);
                    for(int k=0;k<1200;k++)
                    {
                        if(b<=k)//当买的b值比k值小时,说明在你买的设备中最小的为b,所以在买i-1件设备中花费+p与Dp[i][b]取小值
                        {
                            Dp[i][b]=min(Dp[i-1][k]+p,Dp[i][b]);
                        }
                        else
                        {
                            Dp[i][k]=min(Dp[i][k],Dp[i-1][k]+p);//买的b值比k值大时,k是买的设备中的最小值,同理
                        }
                    }
                }
            }
            double ans=0;
            for(int i=1;i<1200;i++)
            {
                if(Dp[n][i]!=INF)
                {
                    if(ans<(i*1.0/Dp[n][i]))//遍历找出b/p的最大值
                    {
                        ans=(i*1.0/Dp[n][i]);
                    }
                }
            }
            printf("%.3f
    ",ans);
        }
    
        return 0;
    }
    
  • 相关阅读:
    docker从容器中怎么访问宿主机
    fail2ban CentOS7安装
    关于sql当中的isnull和ifnull的区别
    关于mybatis反向生成的时候,对于数据库当中的数据类型是text的处理。
    关于Java当中的MapUtils工具类的使用和注意事项。
    在大数据管理平台HDP的ambria的时候遇到python的安全认证的问题
    通过java代码实现调用excel当中的宏的操作。
    通过vba实现对word当中个的标签进行批量的替换
    通过vba实现对word当中的表格动态的插入行,同时对表中进行数据的填充。
    关于vba实现删除word文档中的指定表格。
  • 原文地址:https://www.cnblogs.com/juechen/p/5255967.html
Copyright © 2011-2022 走看看