POJ--3250 -- Bad Hair Day [栈模拟]

 

Bad Hair Day
 
 
Time Limit: 2000MSMemory Limit: 65536K
Total Submissions: 11633Accepted: 3927
 
 

Description

Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads.

Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.

Consider this example:

        =
=       =
=   -   =         Cows facing right -->
=   =   =
= - = = =
= = = = = =
1 2 3 4 5 6 

Cow#1 can see the hairstyle of cows #2, 3, 4
Cow#2 can see no cow's hairstyle
Cow#3 can see the hairstyle of cow #4
Cow#4 can see no cow's hairstyle
Cow#5 can see the hairstyle of cow 6
Cow#6 can see no cows at all!

Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.

 

Input

Line 1: The number of cows, N.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.
 

Output

Line 1: A single integer that is the sum of c 1 through cN.
 

Sample Input

6
10
3
7
4
12
2

Sample Output

5

 

 

Code:

 

哭用很没感觉的DP写了一遍,好不容易结果对了,又RE

终于, 也不知道哪里错,放弃.. 改栈模拟

题目中高度相等的情况也要考虑的, 想哭啊哭

 

第一次:RE RE RE

用结构体存放牛的高度和它前面比他高的牛的编号,一开始赋值为自己

比较的时候从后往前,比较前面一个之后之后跳到它的next比较相加

为什么RE呢?

 

#include<stdio.h>
#include<string.h>

typedef struct node
{
	int height,next;
}node;

node cow[8005];
int dp[80005];

int main()
{
	int n,next,i,j,t;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&cow[i].height);
		cow[i].next = i;
	}
	memset(dp,0,sizeof(dp));
	for(i=n-1;i>=1;i--)
	{
		j=i+1;			
		if(cow[i].height <= cow[j].height) 	cow[i].next = j;
		else
		{
			dp[i] = dp[j]+1;
			t = cow[j].next;
			while(cow[t].height < cow[i].height && t!=cow[t].next)
			{
				dp[i] += dp[t]+1;	
				t = cow[t].next;
			}
			cow[i].next = t;				
		}
	}
	unsigned long sum=0;
	for(i=1;i<=n;i++)
		sum += dp[i];			
	printf("%u\n",sum);		
	return 0;
} 


 

 

第二次:

 

可以反过来考虑, 计算每头牛被后面几头牛看到

如果栈顶元素比下一头牛高,就加上size,因为里面的肯定都能看到这头牛是吧?

如果低或者相等,就出栈,直到遇到一个高的

我用的STL中的栈,可以用数组代替,这样数组的下标就可以代替栈的长度,节省时间

 

#include<stdio.h>
#include<stack>
#include<iostream>
#include<string.h>
using namespace std;
stack<int>see;
int cow[80005];

int main()
{
	int n,i;
	unsigned long sum=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&cow[i]);
	see.push(cow[1]);
	for(i=2;i<=n;i++)
	{	
		while(!see.empty() && see.top() <= cow[i])  see.pop();
		sum += see.size();
		see.push(cow[i]);
	}		
	printf("%u\n",sum);
//	while(!see.empty()) see.pop();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值