标签:
http://poj.org/problem?id=1018
Description
Input
Output
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
/** poj 1018 枚举 题目大意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。 现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价。 解题思路:这道题的a[i][j]较小,可以用枚举直接过,枚举所有可能的B值。(所有组别中最小的最小值和最小的最大值之间,至于flag判断没有也可以,只是这样可以优化一下时间复杂度) */ #include <stdio.h> #include <string.h> #include <iostream> using namespace std; struct note { int x,y; } a[105][105]; int n,num[105],maxx[105],minn[105],flag[100005]; int find(int b) { int ret=0; for(int i=0; i<n; i++) { int minp=0x3f3f3f3f; for(int j=0; j<num[i]; j++) { if(a[i][j].x>=b) minp=min(minp,a[i][j].y); } ret+=minp; } return ret; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(flag,0,sizeof(flag)); for(int i=0; i<n; i++) { scanf("%d",&num[i]); for(int j=0; j<num[i]; j++) { scanf("%d%d",&a[i][j].x,&a[i][j].y); flag[a[i][j].x]=1; } } for(int i=0; i<n; i++) { minn[i]=maxx[i]=a[i][0].x; for(int j=1; j<num[i]; j++) { maxx[i]=max(maxx[i],a[i][j].x); minn[i]=min(minn[i],a[i][j].x); } } int s=minn[0]; int e=maxx[0]; for(int i=1; i<n; i++) { s=min(s,minn[i]); e=min(e,maxx[i]); } double ans=0; for(int i=s; i<=e; i++) { if(flag[i]) { int d=find(i); ans=max(ans,i*1.0/d); } } printf("%.3lf\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/42918245