CF 1138C

https://codeforces.com/problemset/problem/1138/C

题意:

nxm条街道,每个路口有个高度已知的大厦,然后站在每个路口看,对应的两条街道的楼都可以将高度简化成1,2,3...

保证同一条街道上的大厦高度的大小关系不能改变的前提下,打印每个路口能看到的横竖街道上最高的简化过的楼层。

思路:

计算每个路口的两路排序和不同高度大厦的数量(9栋大厦可能只有2个高度),算出这个路口能看到的最高楼层。

比如横向第5,共8个;纵向第3,公7个;那最高层最小是5+(7-3) = 9  

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <map>

using namespace std;

class ts
{
public:
	int h;
	int l;
	int r;
	int ls;
	int rs;
public:
	int get_p()
	{
		//printf("\nh= %d l = %d r = %d ls = %d rs = %d \n", h, l, r, ls, rs);

		int temp = max(ls-l, rs-r);
		int jishu = max(l,r);
		return jishu+temp;
	}

};

ts a[1010][1010];

int main()
{
	vector<int> vec;
	map<int,int> mpa;
	int n,m;
	while(scanf("%d %d",&n, &m)!=EOF)
	{
		for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
		{
			scanf("%d",&a[i][j].h);
		}
		// east
		for(int i=0; i<n; i++)
		{
			mpa.clear();
			for(int j=0; j<m; j++)
			{
				mpa[a[i][j].h]=0;
			}
			int cnt = 1;
			for(auto &itor : mpa)
			{
				itor.second = cnt++;
			}
			for(int j=0; j<m; j++)
			{
				a[i][j].rs = cnt-1;;
				a[i][j].r = mpa[a[i][j].h];
			}	
		}

		// south
		for(int j=0; j<m; j++)
		{
			mpa.clear();
			for(int i=0; i<n; i++)
			{
				mpa[a[i][j].h]=0;
			}
			int cnt = 1;
			for(auto &itor : mpa)
			{
				itor.second = cnt++;
				//printf("第%d列 height = %d :%d\n", j, itor.first, itor.second);
			}
			for(int i=0; i<n; i++)
			{
				a[i][j].ls = cnt-1;;
				a[i][j].l = mpa[a[i][j].h];
			}	
		}


		//OUTPUT
		for(int i=0; i<n; i++)
		{
			for(int j=0; j<m; j++)
			{
				auto tmp = a[i][j].get_p();
				if(j == 0)
					printf("%d", tmp);	
				else
					printf(" %d", tmp);	
			}
			printf("\n");
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值