Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 11633 | Accepted: 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
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.
Output
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;
}