牛客多校第六场 C-Combination of Physics and Maths(前缀和、贪心)

目录

  • 题意
  • 解题思路
  • 代码

题意

  • 链接:Combination of Physics and Maths
  • 一个矩阵的底面积定义为最后一行的数的和,重量定义为所有数的和,给一个正整数矩阵,找一个“压强”最大的可非连续子矩阵

解题思路

  • 选底为第i行的子矩阵,则最优情况为顶为第一行
  • 令已选的某列的重量为a1 ,底面积为b1,对于重量为a2,底面积为b2的列
    若 a 1 b 1 > a 2 b 2 则 a 1 b 1 > a 1 + a 2 b 1 + b 2 ( 移 项 作 差 可 证 ) 若\quad\frac{a_1}{b_1} > \frac{a_2}{b_2} \quad则\quad \frac{a_1}{b_1} > \frac{a_1+a_2}{b_1+b_2}\quad(移项作差可证) b1a1>b2a2b1a1>b1+b2a1+a2()
    则不选择该列的压强会更大
    贪心可得,选取压强最大的列即最优的
    所以答案就是所有行的列压强最大的最大

代码

#include
#include
#include
using namespace std;
int t,a[202][202],sum[202][202];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",&a[i][j]);
		memset(sum,0,sizeof(sum));	
		for(int j=1;j<=m;j++)
			for(int i=1;i<=n;i++)
				sum[i][j]=sum[i-1][j]+a[i][j];
		double ans=0;
		for(int i=1;i<=n;i++)
		{
			double maxj=0;
			for(int j=1;j<=m;j++)maxj=max(maxj,1.0*sum[i][j]/a[i][j]);
			ans=max(ans,maxj);
		}
		printf("%.8lf\n",ans);
	}
	return 0;
} 

你可能感兴趣的:(2020牛客多校赛,#,7.27第六场)