赞
踩
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
平面上有 条直线,其中第 条直线是 。
请计算这些直线将平面分成了几个部分。
输入格式
第一行包含一个整数 。
以下N行,每行包含两个整数 。
输出格式
一个整数代表答案。
样例输入
3
1 1
2 2
3 3
Data
样例输出
6
Data
评测用例规模与约定
对于 的评测用例,, 。
对于所有评测用例,, 。
****思路:****这个题是相当有意思,如果两条直线平行,多增加一条边,平面多增加一,如果相交,就再多增加一,用pos记录相交的点,就是额外增加的面,最后答案就是增加的边数加pos的数量,加上原始面1
#include<bits/stdc++.h> using namespace std; const int N=1005; int main() { int n; cin>>n; int a,b; long double A[N],B[N]; pair<long double,long double> p; set<pair<long double,long double> > s;//利用set自动去重筛选掉重边 for(int i=0;i<n;i++) { scanf("%d %d",&a,&b); p.first=a; p.second=b; s.insert(p); } int i=0;//讲去重后的数据重新放回A,B数组 for(set<pair<long double,long double> >::iterator 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++)//从下标1开始,也就是第二条直线 { set<pair<long double,long double> > pos;//记录第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; p.first=1.0*(b2-b1)/(a1-a2);//如果相交,求x坐标 p.second=1.0*a1*((b2-b1)/(a1-a2)) +b1;//相交后的y坐标 pos.insert(p); } ans+=pos.size()+1;//因为没有之前切分之前,就有 一个面 } printf("%d\n",ans); return 0; }
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。