牛客6—— Combination of Physics and Maths (思维)

原题链接

题意:

矩形的底面积为最后一行数的和,压力为所有数的和,找一个压力/底面积(即压强)最大的可非连续子矩阵。

思路:

选择单列一定优于选择多列,证明:

图片说明
所以只需要找到每列的最大即可。

代码:

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define I_int ll
typedef pair<int,int> PII;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
char F[200];
inline void out(I_int x) {
    if (x == 0) return (void) (putchar('0'));
    I_int tmp = x > 0 ? x : -x;
    if (x < 0) putchar('-');
    int cnt = 0;
    while (tmp > 0) {
        F[cnt++] = tmp % 10 + '0';
        tmp /= 10;
    }
    while (cnt > 0) putchar(F[--cnt]);
    //cout<<" ";
}
int a[300][300];
int main(){
    int T=read();
    while(T--){
        int n=read(),m=read();
        double res=1e-18;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++) a[i][j]=read();
        for(int j=1;j<=m;j++){
            ll sum=0;
            for(int i=1;i<=n;i++){
                sum+=a[i][j];
                res=max(res,1.0*sum/a[i][j]);
            }
        }
        printf("%.8f\n",res);
    }
    return 0;
}