프로 그래 밍 문제 쇼핑 - 텐 센트 학교 백 스테이지 필기시험 모집

1476 단어 문 제 를 풀다
시간 제한: C / C + + 2 초, 기타 언어 4 초
공간 제한: C / C + + 256 M, 기타 언어 512 M
Q. 주말 에 그의 동료 들 과 대도시 에 쇼핑 하 러 왔 는데 한 산책 로 에 고 층 건물 이 많 고 모두 n 개의 고 층 건물 이 한 줄 로 서 있 었 다.
작은 Q 는 첫 번 째 동 에서 마지막 동 까지 걸 어 갔 는데 작은 Q 는 이렇게 많은 건물 을 본 적 이 없 었 다. 그래서 그 는 각 건물의 위치 에서 몇 채 의 건물 을 볼 수 있 는 지 알 고 싶 었 다.(앞의 건물 이 뒤의 건물 보다 높 을 때 뒤의 건물 은 가 려 진다) 
입력 설명:
첫 번 째 줄 에 숫자 n 을 입력 하면 건물의 동 수 를 대표 합 니 다. 다음 줄 에는 n 개의 숫자 wi (1 < = i < = n) 가 포함 되 어 있 고 모든 건물의 높이 를 대표 합 니 다.
1<=n<=100000;
1<=wi<=100000; 
출력 설명:
    ,       n   vi,     Q  i           。

입력 예 1:
6
5 3 8 3 2 5

출력 예 1:
3 3 5 4 4 4

 
나의 해답:
#include 
#include 
using namespace std;
#include 
#include

int main()
{
	int n;
	cin >> n;
	int x[100001];
	for (int i = 0; i < n; i++)
	{
		cin >> x[i];
	}

	vector a, b;
	stack s1, s2;

	for (int i = 0, j = n - 1; i < n, j>=0; i++, j--)
	{
		a.push_back(s1.size());
		b.push_back(s2.size());

		while(!s1.empty() && s1.top() <= x[i])
		{
			s1.pop();
		}
		while(!s2.empty() && s2.top() <= x[j])
		{
			s2.pop();
		}

		s1.push(x[i]);
		s2.push(x[j]);
	}
	for (int i = 0; i < n; i++)
	{
		cout << a[i] + b[n - 1 - i]+1 << " ";
	}
	system("pause");
	return 0;
}


좋은 웹페이지 즐겨찾기