栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯11

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯11


在做这题的想到的是平行和相交以及重合的几种关系,两条线平行是会多出一个面,相交时会多出两个面,重合时不会增加面,第一次做的时候只考虑了每两条线之间的这些关系。
正确做法应该是考虑交点,写几个例子会发现是多出来的面正好是交点数+1

#include
#include 
using namespace std;

int main(){
	
	int n;
	cin >> n;

	pair p;
	set> st;
	for(int i =1 ;i<=n;i++){
		cin >> p.first >> p.second;
		st.insert(p);
	}
	
	int k[n+1],b[n+1];
	int len = 0;
	for(set>::iterator it = st.begin();it!=st.end();it++){
		k[++len] = it->first;
		b[len] = it->second;
	}
	int ans = 2;
	set> s;
	pair pp;
	for(int i = 2;i<=len; i++){
		s.clear();
		for(int j = i-1;j>0;j--){
			
			if(k[i] == k[j]) continue;
			
			pp.first = 1.0*(b[i]-b[j]) / (k[j]-k[i]);		//这里其实就是根据两条直线的方程求交点,自己列方程组化简一下
			pp.second = k[i]*p.first + b[i];
			
			s.insert(pp);
		}
		ans += s.size() + 1;
	}
	cout << ans << endl;
	
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/766751.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号