COCI2014silueta

題目大意:

有一個畫家,畫了n棟摩天大樓。(實際上只有遠遠望去的輪廓)。每棟樓都是一個矩形,有些矩形是重疊在一起的。所有的矩形的底邊都在一條直線上。很不幸,畫被燒燬了。但是記得每個矩形的位置和高度,現在請你復原這幅畫,並求出矩形的輪廓線的周長(不包含底邊)。

輸入:

第一行:給出一個整數n表示有n棟大樓。(n<10000)
接下來有n行,每行三個整數Li,Ri,Hi。表示第i棟樓的左下角座標爲(Li,0),右上角座標爲(Ri,Hi)。(1<=Li,Ri,Hi<=1000,3<=Ri-Li<=1000)

輸出:

第一行爲一個整數,表示摩天大樓的周長。
接下來h+1行,爲復原的地圖。
其中h表示最高的那棟樓的高度。

樣例輸入:

3
1 5 4
7 11 3
9 13 5

樣例輸出:

28
........####
####....#..#
#..#..###..#
#..#..#....#
#..#..#....#
************

解釋:


分析:

保存每一個橫座標最大的高度,亂搞輸出。

code:

#include<cstdio>
#define MAXN 10000
#define MAXL 1000
using namespace std;
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
int n,ans,R,H,lim;
int hei[MAXL+1];
char map[MAXL+5][MAXL+5];
int main()
{
	int i,j,l,r,h;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",&l,&r,&h);
		R=max(R,r);
		H=max(H,h);
		for(j=l;j<r;j++)
			hei[j]=max(hei[j],h);
	}
	for(i=1;i<R;i++)
		for(j=1;j<=H;j++)
			map[i][j]='.';
	for(i=1;i<R;i++)
	{
		if(hei[i]>0)
		{
			map[i][hei[i]]='#',++ans;
			if(hei[i-1]==0||hei[i+1]==0)
				++ans;
		}
		if(hei[i]>=hei[i-1]||hei[i]>=hei[i+1])
		{
			for(j=hei[i]-1;j>=min(max(hei[i-1],1),max(hei[i+1],1));j--)
				map[i][j]='#',++ans;
		}
	}
	printf("%d\n",ans);
	while(!hei[lim])
		++lim;
	for(j=H;j>=1;j--)
	{
		for(i=lim;i<R;i++)
			printf("%c",map[i][j]);
		printf("\n");
	}
	for(i=lim;i<R;i++)
		printf("*");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章