標籤:scanf href targe std \n 最小值 print define 最小
http://codeforces.com/contest/1060/problem/C
題意:
a、b數組長度分別為n、m。矩陣C,Cij=ai*bj。在C中找到一個子矩陣,該子矩陣所有元素和不大於x,求這樣的子矩陣的最大面積。
思路:
1、將矩陣元素和轉換為(Ai+……+Aj)*(Bk+……+Bl)的形式,即a數組中一段連續的元素和 乘以 b數組中一段連續的元素和。
2、由於只要求求出最大面積,故長和寬的起點終點位置任意,故只需統計a、b數組所有連續長度的最小元素和(例,a的長度為5的連續段的元素和的最小值)
最後依次枚舉子矩陣的長和寬。
#include<cstdio>#include<iostream>using namespace std;#define LL long longint main(){ LL x; int n,m,num1[2005],num2[2005]; int sub1[2005],sub2[2005],sum1[2005],sum2[2005]; sum1[0]=sum2[0]=0; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1; i<=n; i++) { scanf("%d",&num1[i]); sum1[i]=sum1[i-1]+num1[i]; sub1[i]=2000*2000; } for(int i=1; i<=m; i++) { scanf("%d",&num2[i]); sum2[i]=sum2[i-1]+num2[i]; sub2[i]=2000*2000; } scanf("%I64d",&x); for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) { int len=j-i+1; sub1[len]=min(sub1[len],sum1[j]-sum1[i-1]); } for(int i=1; i<=m; i++) for(int j=i; j<=m; j++) { int len=j-i+1; sub2[len]=min(sub2[len],sum2[j]-sum2[i-1]); } int res=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if((LL)sub1[i]*sub2[j]<=x) //兩個sub相乘可能超int res=max(res,i*j); printf("%d\n",res); } return 0;}
codeforces_C. Maximum Subrectangle