目录
前言
对于平面问题,最重要的就是 找对规律!!
上题目
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;
}
二、总结
题的难度不大,重要的是规律!!规律!!