Bad Hair Day
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: Cow#1 can see the hairstyle of cows #2, 3, 4 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. Output Line 1: A single integer that is the sum of c1 through cN. Sample Input Sample Output Source |
算法分析:
很简单的一道题,一开始是这样想的,结果超时
其实是单调栈的应用,转换一下思想:从右往左看只能看到比自己身高大的牛,然后如果身高变小,那么到此为止。
#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());
}
}