给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形
的价值。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using std::swap; using std::min; using std::max; const int M=2e3+7; char buf[M*M*11],*ptr=buf-1; int read(){ int ans=0,f=1,c=*++ptr; while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=*++ptr;} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=*++ptr;} return ans*f; } int n,m,k,s[M][M],cnt,sum,ans; struct pos{ int x,y,w; bool operator <(const pos& h)const{return w>h.w;} }q[M*M]; int main(){ fread(buf,1,sizeof(buf),stdin); n=read(); m=read(); k=std::min(4*n,n*m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) s[i][j]=read(),q[cnt++]=(pos){i,j,s[i][j]}; std::nth_element(q,q+k,q+cnt); for(int i=0;i<k;i++){ for(int j=0;j<i;j++)if(q[i].x!=q[j].x&&q[i].y!=q[j].y){ sum=min(s[q[i].x][q[i].y],s[q[j].x][q[j].y]); sum=min(sum,s[q[i].x][q[j].y]); sum=min(sum,s[q[j].x][q[i].y]); ans=max(ans,sum); } }printf("%d\n",ans); return 0; }
原文:http://www.cnblogs.com/lyzuikeai/p/7751559.html