#include <stdio.h>
#include <string.h>
int num[1024];
int main()
{
int k;
int n;
int temp;
scanf("%d", &k);
while(k--)
{
memset(num, 0, sizeof(int)*1024);
scanf("%d", &n);
int i;
int max=1;
for(i=0; i<n; ++i)
{
scanf("%d", &temp);
int j;
for(j=1; j<=temp; ++j)
++num[j];
}
for(i=1; i<=n; ++i)
{
//printf("num[%d]=%d\n", i, num[i]);
if(num[i]>=i)
max=i;
}
printf("%d\n", max);
}
return 0;
}
@这道题由于矩形的宽度都为1个单位,因此每组输入数据所能构成最大正方形的边长取决于这组数据中矩形的高度。着手点在于对于每种高度的矩形,在录入数据时,将其高度作为数组下标,并将所有小于等于此高度数组下标内的数组元素做加1运算,这样做不仅记录数据,而且在无形中对高度进行了升序处理。数据录入结束后,从数组下标为1处开始访问num数组,依次检查每个数组下标所对应的数组元素是否大于或等于该下标的值,若满足则将此时的数组下标存入变量max中。最终变量max中的结果即为最大正方形的边长。
原文:https://www.cnblogs.com/commario/p/11811245.html