ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++-POJ1018-Communication System

2020-02-06 22:52:04  阅读:194  来源: 互联网

标签:POJ1018 include const int Communication scanf System 101 data


贪心算法:先排序,再枚举最小带宽(B),每次更新当前最小花费(P)和以及答案(ans)

#include <cstdio>
#include <algorithm>
using namespace std;

struct data {int b,p;} a[101][101];
int m[101],B[100001];

bool cmp(const data &A,const data &B) {
    if(A.b==B.b)return A.p > B.p;
    return A.b < B.b;
}

int main() {
    int t,n;
    for(scanf("%d",&t);t--;) {
        scanf("%d",&n);
        int i_B=0;
        for(int i=1; i<=n; i++) {
            scanf("%d",&m[i]);
            for(int j=1; j<=m[i]; j++) {
                scanf("%d%d",&a[i][j].b,&a[i][j].p);
                B[++i_B]=a[i][j].b;
            }
            sort(a[i]+1,a[i]+m[i]+1,cmp);
        }
        sort(B+1,B+i_B+1);
        double ans=0;bool flag;
        for(int i=1; i<=i_B; i++) { //枚举B的值
            if(B[i]==B[i+1] && i<i_B) continue;//剪枝
            int sum_p=0,min_p;
            for(int j=1; j<=n; j++) {
                flag=true,min_p=2147483647;
                for(int k=1; k<=m[j]; k++) 
                    if(a[j][k].b>=B[i] && a[j][k].p<min_p) 
                        min_p=a[j][k].p,flag=false;
                if(flag) break;
                sum_p+=min_p;
            }
            if(flag) break;
            ans=max(ans,(double)B[i]/sum_p);
        }
        printf("%.3f\n",ans);
    }
    return 0;
}

 

标签:POJ1018,include,const,int,Communication,scanf,System,101,data
来源: https://www.cnblogs.com/JasonCow/p/12271364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有