天梯赛 L3-009 长城 计算几何

一 题目

天梯赛 L3-009 长城 计算几何_第1张图片

二 思路

这道题就是找凸点的个数,就是答案。可能有些人会说,那不就是大于左右两边就是凸点吗,只对了一半,如下图所示,B点也是算凸点,但是并没有大于左右两边。

天梯赛 L3-009 长城 计算几何_第2张图片

因此,我们判断凸点的依据,是看AB的斜率是否大于AC的斜率,如图所示,AB的斜率大于AC的斜率,所以是凸点。反之,不是。此外,我们用一个栈去维护凸点,就可以得到凸点的个数,也就是答案。

三 代码

#include
#include
#define int long long
using namespace std;
const int N=100010;
int s[N],cnt;//数组模拟栈,栈中保留凸点以及起点终点
setans;
int x[N],y[N],n;//输入数据
bool check(int a,int b,int c)//判断b这个点是不是凸点,根据斜率判断
{
    return (y[a]-y[b])*(x[a]-x[c])<=(y[a]-y[c])*(x[a]-x[b]);
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>y[i];
        if(cnt>=2)
        {
            while(cnt>=2 && check(i,s[cnt],s[cnt-1]))cnt--;//不是凸点,从栈中去除
            if(cnt>1)ans.insert(s[cnt]);//说明是凸点,插入答案
        }
        s[++cnt]=i;
    }
    cout<

你可能感兴趣的:(算法,数据结构,c++)