题目大意:

给出一些酒店的价格和其到海岸的距离,要求挑选出一些候选酒店。一个候选酒店要满足以下两个要求:

比酒店M更靠近海岸的酒店的价格都比酒店M贵。

比酒店M更便宜的酒店到海岸的距离都比酒店M到海岸的距离远。

思路:

单调栈模板题。

代码:

#include<iostream>
#include<stdio.h>
#include<stack>
using namespace std;
struct point
//将酒店信息封装在结构体中。 
{
	int dis;
	int cost;
}hotel[10001];
int cmp(const void* m,const void* n)
//将酒店按到海岸距离由远及近,价格由高到底排序。 
{
	if((*(point*)n).dis==(*(point*)m).dis)
		return (*(point*)n).cost-(*(point*)m).cost;
	return (*(point*)n).dis-(*(point*)m).dis;
}
int main()
{
	int n;
	while(scanf("%d",&n)&&n)
	{
		stack<point> s;
		for(int i=0;i<n;i++)
			scanf("%d%d",&hotel[i].dis,&hotel[i].cost);
		qsort(hotel,n,sizeof(hotel[0]),cmp);
		s.push(hotel[0]);
		for(int i=1;i<n;i++)
		{
			while(s.size()&&hotel[i].cost<=s.top().cost)
			//在栈不为空的情况下,判断当前酒店价格是否小于等于栈顶酒店价格。
				s.pop();
				//将栈顶酒店出栈,直到当前酒店价格大于栈顶酒店价格为止。
				//出栈的酒店是不符合候选要求的酒店。 
			s.push(hotel[i]);
		}
		printf("%d\n",s.size());
		//栈中剩下的酒店都是候选酒店。 
	}
}