平面问题:平面分割 平面切分

目录

前言

1.平面分割

2.平面切分

一、解题

1.平面分割

2.平面切分

二、总结


前言

对于平面问题,最重要的就是 找对规律!!

上题目

1.平面分割

 原题链接

2.平面切分


平面切分原题链接。

一、解题

1.平面分割

规律分析:

每多1个交点,平面数+1

先放直线,每条直线对平面的基础贡献数是1,也就是没有交点,只增加一个平面

每条直线 最多与之前的每条直线有1个交点,

所以, 已经有i-1条直线增加第i条直线时,最多增加i个平面;(1+i-1=i)

再放圆,每个圆最多与之前的每个圆有2个交点,并与20条直线有20*2个交点

最后把交点数相加即可

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int i,sum=0;
  for(i=3,sum=4;i<=20;i++)sum+=i;//先放直线
  for(i=1;i<=20;i++){//再放圆
    sum+=(20*2);//每一个圆和20条直线的最多交点数
    sum+=((i-1)*2);//每一个圆和2前面圆的最多交点数
  }
  cout<<sum;
  return 0;
}

2.平面切分

其实规律与上面的题类似,只是现在算的不是最多的情况

要考虑重合的情况

每条直线对平面的贡献数最低是1,也就是平行,没有交点,只多了一个平面。

若有交点,再加上本条直线与前(i-1)条直线不重复的交点数

举个例子

 所以,一定一定要记得直线去重,不然算出的答案会多,呜呜

#include <bits/stdc++.h>
using namespace std;
int main()
{
  // 请在此输入您的代码
int n,i,j,cnt=1,count=0,p;
double x2[1009],y2[1009];
cin>>n;
int k[n],b[n];
for(i=0;i<n;i++){
  cin>>k[i]>>b[i];
 //for(j=0;j<i;j++)if(k[i]==k[j]&&b[i]==b[j]){i--;n--;}这样也可以去重
}



for(i=0;i<n;i++){//筛查每一条直线k[i],b[i]
   count=0;//count记录交点个数
  
   for(j=0;j<i;j++){//判断每一条直线 与之前直线k[j],b[j]的交点
   
     if(k[i]==k[j]&&b[i]==b[j]){continue;}//去重
     else 
	 if(k[i]==k[j]&&b[i]!=b[j]){continue;}//平行
     
     else if(k[i]!=k[j]){//相交    k[i]!=k[j]&&b[i]!=b[j]
        count++;//下标从1起
        x2[count]=(b[j]-b[i])*1.0/(k[i]-k[j])*1.0;
        y2[count]=k[i]* x2[count]+b[i];
       
        for(p=1;p<count;p++)if(fabs(x2[count]-x2[p])<=1e-5&&fabs(y2[count]-y2[p])<=1e-5){count--;break;}//交点重合
        }
   // cout<<count<<endl;//
   }
  cnt+=(count+1);//
  //cout<<cnt<<endl;
}
cout<<cnt;
  return 0;
}

二、总结

题的难度不大,重要的是规律!!规律!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值