题目链接:https://ac.nowcoder.com/acm/contest/5671/C
题目大意:
挑一些行和列,其交叉元素组成了一个矩阵,把矩阵的总数看作是力,把矩阵的最后一行之和看作是面积,问压强最大是多少。
解题思路:
先上结论:等比定理
最大答案一定是在两个子列之中选的。可以证明:(结论证明放在代码下面:)
a/b = c/d时, (a+c)/(b+d) = a/b = c/d
a/b < c/d, a,b,c,d都是大于0的整数,c/d > (a+c)/(b+d) > a/b
复杂度O(Tnm)
代码:

#include<bits/stdc++.h>
using namespace std;
int a[210][210];
int main()
{
    int T; scanf("%d",&T);
    while(T--)
    {
        int n, m;
        scanf("%d%d",&n,&m);
        double maxx = 0.0;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                scanf("%d",&a[i][j]);
                a[i][j] += a[i-1][j];
                maxx = max(1.0*a[i][j]/(a[i][j]-a[i-1][j]), maxx);
            }
        }

        printf("%.8f\n",maxx);
    }
}

等比定理证明:
设a/b = c/d = k, 则有a=bk,c=dk,(a+c)/(b+d) = (bk+dk)/(b+d) = k,
所以a/b = c/d的时候有 a/b=c/d=(a+c)/(b+d)
如果a,b,c,d是大于0的整数,且a/b < c/d
设a/b=k1, c/d=k2, k1<k2, 设 k1+s = k2;
(a+c)/(b+d) = k1 + d*s/(b+d),因为d/(b+d) < 1,所以 k1 < (a+c)/(b+d) < k2