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)