列表

详情


NC220717. 这双是一道难题

描述

平面上有N条直线,其中第i条直线是y=Ai · x + Bi

请计算这些直线将平面分成了几个部分。

输入描述

第一行包含一个N。

以下N行,每行包含两个整数Ai, Bi。

输出描述

一个整数代表答案。

示例1

输入:

3
1 1
2 2
3 3

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 5ms, 内存消耗: 388K, 提交时间: 2021-04-08 16:54:07

#include<bits/stdc++.h>
using namespace std;

long double s[1010][2];
long long ans;
bool st[1010]; 
pair<long double,long double> p;

int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>s[i][0]>>s[i][1];
		set<pair<long double,long double> > points;
		for(int j=0;j<i;j++){
			if(st[j])continue;
			if(s[i][0]==s[j][0]){
				if(s[i][1]==s[j][1]){
					st[i]=true;
					break;
				}else continue;
			}
			p.first=(s[j][1]-s[i][1])/(s[i][0]-s[j][0]);
			p.second=s[i][0]*p.first+s[i][1];
			points.insert(p);
		}
		if(!st[i])ans+=points.size()+1;
	}
	cout<<ans+1;
	return 0;
}

Python3(3.9) 解法, 执行用时: 38ms, 内存消耗: 6860K, 提交时间: 2021-04-11 10:30:09

n=int(input())
a=[]
for i in range(n):
    b=list(map(int,input().split()))
    if b not in a:
        a.append(b)
if len(a)==1:
    print(2)
else:
    part=2
    for i in range(1,len(a)):
        ai,bi=a[i] 
        mid=set()
        for j in range(i):
            aj,bj=a[j][0],a[j][1]
            if aj==ai:
                pass
            else:
                x=(bi-bj)/(aj-ai)
                y=x*ai+bi
                mid.add((x,y))
        part+=len(mid)+1
    print(part)  
             

上一题