蓝桥杯真题:平面切分

样例">输入输出样例

示例

输入

3
1 1
2 2
3 3

输出

6

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

这题我们要知道一点平面几何的知识:在当前平面内加入一条直线后,新增加的平面个数等于该条直线被其余直线分割的段数,也就是交点+1,无论这个交点以前是否已经存在于其他两条直线。

然后考虑一些细节:

1.两条重复的直线等于是没有意义的,所以我们在输出端就把重复的去掉,可以用set来保证。

2.一条一条加直线到平面,我们计数的时候只要求出该直线和之前直线的交点,这些交点是不能重复的,再用一个set来保存就好了

代码如下所示:

#include <iostream>
#include <set>
using namespace std;
const int N=1001;
int n,ans=1;
typedef pair<long double,long double> PDD;
bool is2Line[1001];//记录某条直线是否与之前一样
int main()
{
  // 请在此输入您的代码
  scanf("%d",&n);
  int a,b;
  set<PDD> s;//筛重复边
  long double A[N],B[N];
  for(int i=0;i<n;++i)
  {
    scanf("%d%d",&a,&b);
    s.insert({a,b});
  }
  int i=0;
  for(auto it=s.begin();it!=s.end();++it,++i)
  {
    A[i]=it->first;
    B[i]=it->second;
  }
  long long ans=2;
  for(int i=1;i<s.size();++i)
  {
    set<PDD> point;//第i条直线和先前直线的交点
    for(int j=i-1;j>=0;--j)
    {
      int a1=A[i],b1=B[i];
      int a2=A[j],b2=B[j];
      if(a1==a2)//平行无交点
        continue;
      point.insert({1.0*(b2-b1)/(a1-a2),1.0*a1*(((b2-b1)/(a1-a2)))});
    }
    ans+=point.size()+1;
  }
  printf("%d/n",ans);
  return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值