牛客第六场-Combination of Physics and Maths

题目链接
牛客第六场-Combination of Physics and Maths_第1张图片
牛客第六场-Combination of Physics and Maths_第2张图片

打了六场牛客了,第一次写一篇这题的博客叭
对我个人来讲,这个题可能是卡我平时的代码习惯或者是代码风格以及不好的写法(被安排得十分安详)

题意:选出一个子矩阵,使得所求的压强最大,压强是指这个子矩阵中每个元素之和 / 这个子矩阵最下面一行的元素之和
当然这个题选一列就完事了,多选了反而还比较麻烦。只需要维护每一列元素的前缀和,并且在计算的过程中除以当前这个数,这样就OK,记得要维护当前的最大压强值
代码比较简单,没有什么新鲜感,平平无奇

#include 
using namespace std;
typedef long long ll;
ll read() {
    ll c = getchar(), Nig = 1, x = 0; while (!isdigit(c) && c != '-')c = getchar();
    if (c == '-')Nig = -1, c = getchar();
    while (isdigit(c))x = ((x << 1) + (x << 3)) + (c ^ '0'), c = getchar();
    return Nig * x;
}
#define read read()
double a[208][208];
double sum[208];
int main() {
    int T = read;
    while (T--) {
        int n = read, m = read;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) scanf("%lf", &a[i][j]);
        }
        double ans = 0;
        for (int i = 1; i <= m; i++) {
            sum[i] = 0;
            for (int j = 1; j <= n; j++) {
                sum[i] += a[j][i];
                
                double tt = (sum[i]) / (a[j][i]);
                if (tt > ans) ans = tt;
            }
        }

        printf("%.8f\n", ans);
    }
    return 0;
}
/**
1
3 3
1 3 5
6 8 9
2 7 4


**/

重点是想要通过这篇博客记录自己的不足:

  1. 没必要浪费不必要的时间复杂度来初始化数组,如果在下面处理问题的时候可以顺便把数组初始化在使用的情况下,就不必要在开头进行初始化。
  2. 如果遇到要除法得到小数点后面几位的时候,可以考虑将需要用到的数组设置为double类型,一面会发生十分玄学的问题。
  3. 手贱分不出n or m

你可能感兴趣的:(牛客)