1 条题解
-
1
【2021年省赛B组】试题C: 直线
题解
在平面直角坐标系中,两点确定一条直线,但两点有四个坐标值,我们不太好维护四个坐标值是否重复。 我们知道直线的表示方法中,除了俩点式,还有点斜式,点斜式的话,一个点两个坐标值和一个斜率值,三个值来确定唯一性,虽然不太好写,但是还是能勉强能跑出来。
更进一步,如果那个点是在轴或者轴上,那么一个坐标就恒定为0,只要维护另一个坐标值(其实就是截距)和斜率就好了,简单维护一下,要考虑枚举的斜率不存在的情况。
- 最终答案为:40257
提交代码
#include<bits/stdc++.h> #define EPS 1e-8 void solve() { int n = 20; int m = 21; std::map<std::pair<double, double>, int> mp; std::map<std::array<double, 4>, int> vis; int ans = n + m; std::vector<std::pair<double, double>> res; for(double x1 = 0; x1 < n; x1++) { for(double y1 = 0; y1 < m; y1++) { for(double x2 = 0; x2 < n; x2++) { for(double y2 = 0; y2 < m; y2++) { if(x1 != x2 && y1 != y2) { double k = 1.0 * (y1 - y2) / (x1 - x2); double b = y1 - x1 * k; if(mp[{k, b}] == 0) { mp[{k, b}] = 1; res.push_back({k, b}); ans++; } } } } } } std::sort(res.begin(), res.end()); for(int i = 0; i < res.size() - 1; i++) { if(fabs(res[i].first - res[i +1].first) < EPS && fabs(res[i].second - res[i + 1].second) < EPS) { ans--; } } std::cout << ans << "\n"; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int t = 1; while(t--) solve(); return 0; }
- 1
信息
- ID
- 978
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 67
- 已通过
- 21
- 上传者