POJ 3250 Bad Hair Day 单调栈

Bad Hair Day

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 21217 Accepted: 7253

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 c1 through cN.

Sample Input

6
10
3
7
4
12
2

Sample Output

5

Source

USACO 2006 November Silver

 

 

 

算法分析:

很简单的一道题,一开始是这样想的,结果超时

其实是单调栈的应用,转换一下思想:从右往左看只能看到比自己身高大的牛,然后如果身高变小,那么到此为止。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 80005
#define MOD 123
#define E 1e-6
using namespace std;
int main()
{
   
    int n;
    while(scanf("%d",&n)!=EOF)
    {
    	int a[N];
    	int sum=0;
    	for(int i=1;i<=n;i++)
    		scanf("%d",&a[i]);
		for(int i=1;i<n;i++)
			for(int j=i+1;j<=n;j++)
		{
			
			if(a[i]>a[j]){sum++;}
			else break;
		}
		printf("%d\n",sum);
    }
    return 0;
}

结果发现都用了栈,真是个好东西

#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
#include<cctype>  
#include<cmath>  
#include<iostream>  
#include<sstream>  
#include<iterator>  
#include<algorithm>  
#include<string>  
#include<vector>  
#include<set>  
#include<map>  
#include<stack>  
#include<deque>  
#include<queue>  
#include<list>  
using namespace std;  
const double eps = 1e-8;  
typedef long long LL;  
typedef unsigned long long ULL;  
const int INT_INF = 0x3f3f3f3f;  
const int INT_M_INF = 0x7f7f7f7f;  
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;  
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;  
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};  
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};  
const int MOD = 1e9 + 7;  
const double pi = acos(-1.0);  
const int MAXN = 1e5 + 10;  
const int MAXT = 10000 + 10;  
const int N=10005;
stack<int>s;
int main()  
{  
	int n;
    while(scanf("%d",&n)!=EOF)  
    {  
    	int num;LL ans=0;
    	for(int i=1;i<=n;i++)
		{
			scanf("%d",&num);
			while(!s.empty()&&s.top()<=num) s.pop();
			ans+=s.size();
			s.push(num);
		}
	  printf("%lld\n",ans);
    }  
    return 0;  
      
}  

java

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
	
	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner (new BufferedInputStream(System.in));
		//Scanner in = new Scanner(new BufferedInputStream(System.in));
	    Reader.init(System.in);
	    while(in.hasNext())
	    {
	     Stack<Long> s=new Stack<Long>();
	     Long n=in.nextLong();
	     Long ans=(long) 0;
	     for(int i=1;i<=n;i++)
	     {
	    	 Long v=in.nextLong();
	    	 while(s.size()!=0&&s.peek()<=v)
	    	 {
	    		 s.pop();
	    	 }
	    	 ans+=s.size();
	    	 s.push(v);
	     }
	     System.out.println(ans);
	    }
	}
			
}
class Reader 
{ 
    static BufferedReader reader; 
    static StringTokenizer tokenizer; 
 
    static void init(InputStream input) 
    { 
        reader = new BufferedReader(new InputStreamReader(input)); 
        tokenizer = new StringTokenizer(""); 
    } 
 
    static String next() throws IOException 
    { 
        while(!tokenizer.hasMoreTokens()) 
        { 
            String str=reader.readLine();
            //System.out.println(str);
            tokenizer = new StringTokenizer(str); 
        } 
        return tokenizer.nextToken(); 
    } 
 
    static int nextInt() throws  IOException 
    { 
        return Integer.parseInt(next()); 
    } 
 
    static double nextDouble() throws IOException 
    { 
        return Double.parseDouble(next()); 
 
    } 
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值