打了六场牛客了,第一次写一篇这题的博客叭
对我个人来讲,这个题可能是卡我平时的代码习惯或者是代码风格以及不好的写法(被安排得十分安详)
题意:选出一个子矩阵,使得所求的压强最大,压强是指这个子矩阵中每个元素之和 / 这个子矩阵最下面一行的元素之和
当然这个题选一列就完事了,多选了反而还比较麻烦。只需要维护每一列元素的前缀和,并且在计算的过程中除以当前这个数,这样就OK,记得要维护当前的最大压强值
代码比较简单,没有什么新鲜感,平平无奇
#include <bits/stdc++.h> 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 **/
重点是想要通过这篇博客记录自己的不足:
- 没必要浪费不必要的时间复杂度来初始化数组,如果在下面处理问题的时候可以顺便把数组初始化在使用的情况下,就不必要在开头进行初始化。
- 如果遇到要除法得到小数点后面几位的时候,可以考虑将需要用到的数组设置为double类型,一面会发生十分玄学的问题。
- 手贱分不出n or m