#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到n的升序处理。数据录入结束后,从数组下标为1处开始访问num数组,依次检查每个数组下标所对应的数组元素是否大于或等于该下标的值,若满足则将此数组下标存入变量max中。最终变量max中的结果即为这组数据所能构成的最大正方形边长。

 posted on 2019-11-07 11:55  ComMario  阅读(252)  评论(0编辑  收藏  举报