题目
https://pintia.cn/problem-sets/994805046380707840/problems/994805050277216256
题意
给你若干点 选部分点 使其它所有点到前面点最大斜率点事选中点
思路
放进一个点 向前找到斜率斜率比它后面一个点小的点
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
ll x,y;
}po[100005];
int s[100005];
int vis[100005];
int ok(node a,node b,node c)
{
if((b.y-a.y)*(c.x-b.x) >= (b.x-a.x)*(c.y-b.y)) return 1;
else return 0;
}
int main()
{
int n;
scanf("%d",&n);
int p = 0;
for(int i = 0;i < n;i++)
{
scanf("%lld%lld",&po[i].x,&po[i].y);
if(p >= 1)
{
while(p >= 2&&ok(po[s[p-2]],po[s[p-1]],po[i]))
{
p--;
}
vis[s[p-1]] = 1;
}
s[p++] = i;
}
int ans = 0;
for(int i = 1;i < n;i++)
{
if(vis[i]) ans++;
}
printf("%d\n",ans);
return 0;
}