蓝桥杯 平面切分 数论 欧拉定理 平面个数问题 STLset 写了好久

20 篇文章 1 订阅
该博客探讨了如何利用欧拉定理解决平面内N条直线将平面分割成多个部分的问题。通过输入N条直线的方程式,程序计算每条直线与之前直线的交点并进行去重,最终得出平面被分割的总数。AC代码展示了实现这一算法的具体步骤,包括集合操作和交点计算,适合对算法和几何感兴趣的技术读者。
摘要由CSDN通过智能技术生成

问题描述

平面上有 N条直线,其中第 i条直线是 y = Ai*x + B。
请计算这些直线将平面分成了几个部分。
输入格式
第一行包含一个整数N。
以下N行,每行包含两个整数 Ai, Bi。
3
1 1
2 2
3 3
输出格式
6
一个整数代表答案。

题解思路

根据欧拉定理有结论 每增加一条直线,对平面数增加的贡献值,是其与先前直线的交点数(不包括与已有交点重合的点)+1 这题两处用到了集合去重,一开始用集合加pair存储数据,然后将数据放到数组里对加入的每条直线与之前的之前的直线求交点并且去重,然后累加就是答案,感觉有更好的写法。

AC代码

#include <iostream>
#include <set>
#include <algorithm>
#include <cstdio>
using namespace std;

long double aa[1010];
long double bb[1010];
long long  n;
set <pair <long double,long double> > s;
pair <long double,long double> p;
int main(){
    long double a,b;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a>>b;
        p.first=a;
        p.second=b;
        s.insert(p);
    }
    int y = 0;
    long long anss=2;
    for(set <pair <long double,long double> > ::iterator it=s.begin();it!=s.end();it++,y++){
        aa[y]=it -> first;
        bb[y]=it -> second;
    }
    for(int k = 1;k < s.size(); k++)
    {
        set<pair<long double, long double> > pos;
        for(int j = k-1;j >= 0; j--)
        {
                if(aa[k]==aa[j])
                        continue;
                long double a1=aa[k],b1=bb[k];
                long double a2=aa[j],b2=bb[j];
                p.first = 1.0*(b2-b1)/(a1-a2);
                p.second = 1.0*a1*((b2-b1)/(a1-a2)) + b1;
                pos.insert(p);
        }
        anss+=pos.size() + 1;
    }
    printf("%lld\n",anss);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值