题目看了半天,大意就是每组必须选一个带宽,然后分子是这些带宽的最小值,分母是这些带宽的价格总和,求这个比例的最大值。。我是用比较暴力的方法算的,看题解说是归为贪心的范畴,看不出来和贪心有什么联系,可能是我对贪心没概念。。
#include<stdio.h>
#include<limits.h>
static int n, band[100][100], price[100][100], size[100];
static int total_price(int index, int b, int p)
{
int i, j, sum = p;
for (i = 0; i < n; i++)
{
if (i == index)
continue;
int minp = INT_MAX;
for (j = 0; j < size[i]; j++)
if (band[i][j] >= b && price[i][j] < minp)
minp = price[i][j];
sum += minp;
}
return sum;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
int i, j, minmaxband = INT_MAX;
for (i = 0; i < n; i++)
{
scanf("%d", &size[i]);
int maxband = -1;
for (j = 0; j < size[i]; j++)
{
scanf("%d %d", &band[i][j], &price[i][j]);
if (band[i][j] > maxband)
maxband = band[i][j];
}
if (maxband < minmaxband)
minmaxband = maxband;
}
int tp;
double bp = 0, temp;
for (i = 0; i < n; i++)
for (j = 0; j < size[i]; j++)
if (band[i][j] <= minmaxband)
{
tp = total_price(i, band[i][j], price[i][j]);
temp = band[i][j] / (double) tp;
if (temp > bp)
bp = temp;
}
printf("%.3lf\n", bp);
}
return 0;
}