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