/*
题意:第i头牛,只能看到它右边比他矮的牛的牛头,问所有的牛能看到牛头总数
题解:从后往前搜索,队列中存储牛的最高身高,到第i头牛的时候,对队列进行一次搜索,找到比第i头牛高的牛的最小身高和所在位置j,这样j - i - 1就是第i个牛能够看到的牛头数
*/
#include <iostream>
using namespace std;
const int nMax = 80010;
const int INF = 0x7fffffff;
int h[nMax];
struct Queue
{
int pos;
int max;
Queue(){}
Queue(int pos, int max):pos(pos), max(max){}
}queue[nMax];
int front, rear;
int n;
int main()
{
//freopen("e://data.txt", "r", stdin);
while(scanf("%d", &n) != EOF)
{
for(int i = 0; i < n; ++ i)
scanf("%d", &h[i]);
front = rear = 0;
queue[front ++] = Queue(n, INF);
__int64 ans = 0;
for(int i = n - 1; i >= 0; -- i)
{
int pre;
for(int j = rear; j < front; ++ j)
{
if(queue[j].max < h[i])
break;
pre = j;
}
ans += queue[pre].pos - 1 - i;//②这里先记录结果再进行入队运算
while(rear < front && queue[front - 1].max < h[i])
front --;
queue[front ++] = Queue(i, h[i]);
}
printf("%I64d\n", ans);//①原来这里出错,注意格式
}
return 0;
}
分享到:
相关推荐
博客链接 http://blog.csdn.net/CABI_ZGX/article/details/52701138
我的博客链接:http://blog.csdn.net/CABI_ZGX
模拟题 要注意时间的处理 使用优先队列处理请求的事件 进行适当的运算符重载,可以简化代码
4.1 最大乘积问题 4.2 魔术数字游戏 4.3 Jimmy's Bad Day 5.1 循环赛的日程表问题 5.2 猴子选大王 5.3 售货员的难题 6.1 最大字段和问题 6.2 N*N方阵 6.3 埃及分数最好表达式
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
北大POJ3253-POJ3253-Fence Repair【STL优先队列】 解题报告+AC代码
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj分类poj分类poj分类poj分类
北大POJ1159-Palindrome 解题报告+AC代码
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类
POJ1048,加强版的约瑟夫问题 难度中等