题目:
描述
我们收到了Pizoor Communications Inc.的特殊通信系统订单。该系统由多个设备组成。对于每个设备,我们可以从几个制造商中自由选择。来自两家制造商的相同设备的最大带宽和价格不同。
总带宽(B)是指通信系统中所选设备的带宽的最小值,总价格(P)是所有选定设备的价格之和。我们的目标是为每个设备选择一个制造商以最大化B / P.
输入
输入文件的第一行包含一个整数t(1≤t≤10),测试用例的数量,后跟每个测试用例的输入数据。每个测试用例以包含单个整数n(1≤n≤100)的行开始,通信系统中的设备数量,后面是以下格式的n行:第i行(1≤i≤n)从mi(1≤mi≤100)开始,第i个设备的制造商数量,然后是同一行中的mi对正整数,分别表示设备的带宽和价格,对应于制造商。
输出
您的程序应为每个包含单个数字的测试用例生成一行,该数字是测试用例的最大可能B / P.将输出中的数字四舍五入到小数点后的3位数。
样例输入
1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110
样例输出
0.649
//232K 47MS C++ 1164B 2014-05-07 19:16:42 #include<stdio.h> #include<string.h> #include<stdlib.h> struct node{ int b; int p; }a[105][105]; int b[105]; int n; inline int Max(int x,int y) { return x>y?x:y; } inline int Min(int x,int y) { return x<y?x:y; } int main(void) { int t,m; scanf("%d",&t); while(t--) { scanf("%d",&n); int ln=0x7ffffff,rn=0; for(int i=0;i<n;i++){ scanf("%d",&b[i]); for(int j=0;j<b[i];j++){ scanf("%d%d",&a[i][j].b,&a[i][j].p); ln=Min(ln,a[i][j].b); rn=Max(rn,a[i][j].b); } } double ans=0; for(int i=ln;i<=rn;i++){ int sminn=0; for(int j=0;j<n;j++){ int minn=0x7ffffff; for(int k=0;k<b[j];k++){ if(a[j][k].b>=i && minn>a[j][k].p) minn=a[j][k].p; } sminn+=minn; } ans=ans>(i*1.0/sminn)?ans:(i*1.0/sminn); //printf("*****%lf\n",ans); } printf("%.3lf\n",ans); } return 0; }
来源:https://www.cnblogs.com/GO-NO-1/p/3714459.html
原文:https://www.cnblogs.com/sweet-ginger-candy/p/11518188.html