10pts求调
查看原帖
10pts求调
430133
liangbob楼主2023/6/17 09:00

RT.

#include <iostream>
#include <iomanip> 
#include <cmath> 
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#define IL inline
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;

IL int read() 
{
    int x = 0,f = 1;
    char c = getchar();
    while(c <'0'|| c >'9'){if(c == '-') f = -1;c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar();
    return x * f;
}

void write(int x) 
{
    if(x < 0) putchar('-'),x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}

struct node
{
	long double k, b;
}a[N];

int main()
{
	int n;
	cin >> n;
	int m = 0;
	set <pair<long double, long double>> p;
	for(int i = 1;i <= n;i++)
	{
		long double x, y;
		cin >> x >> y; //set 去重 
		p.insert({x, y});
	}
	for(auto i = p.begin();i != p.end();i++) //遍历并存入结构体数组 
	{
		a[++m] = {(*i).first, (*i).second};
	}
	int ans = 0;
	for(int i = 2;i <= m;i++)
	{
		set <pair<long double,long double>> o;
		for(int j = 1;j < i;j++)
		{
			long double k1 = a[i].k;
			long double k2 = a[j].k;
			long double b1 = a[i].b;
			long double b2 = a[j].b;
			if(k1 == k2) continue; //斜率一致,平行,过掉。 
			long double x1 = (b2 - b1) / (k1 - k2);
			long double y1 = k1 * x1 + b2;
			//根据公式计算交点 
			o.insert({x1, y1});
			//加入 set 去重 
		}
		ans += (o.size() + 1);
	}
	cout << ans + 1 << endl;
	return 0;
}
2023/6/17 09:00
加载中...