3 条题解
-
1
#include <cmath> #include <vector> using namespace std; const double eps = 1e-10; int main() { int T; cin >> T; while (T--) { int n, m; cin >> n >> m; vector<double> x(n), y(n); for (int i = 0; i < n; i++) { cin >> x[i] >> y[i]; } vector<int> covers; for (int i = 0; i < n; i++) { covers.push_back(1 << i); } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double x1 = x[i], y1 = y[i]; double x2 = x[j], y2 = y[j]; double denom = x1 * x2 * (x1 - x2); if (fabs(denom) < eps) continue; double a = (y1 * x2 - y2 * x1) / denom; double b = (y1 - a * x1 * x1) / x1; if (a >= -eps) continue; int cover = 0; for (int k = 0; k < n; k++) { if (fabs(a * x[k] * x[k] + b * x[k] - y[k]) < eps) { cover |= (1 << k); } } if (cover) { covers.push_back(cover); } } } vector<int> dp(1 << n, n + 1); dp[0] = 0; for (int mask = 0; mask < (1 << n); mask++) { if (dp[mask] > n) continue; int rest = ((1 << n) - 1) ^ mask; if (!rest) continue; int low = __builtin_ctz(rest); for (int c : covers) { if (c & (1 << low)) { int nmask = mask | c; dp[nmask] = min(dp[nmask], dp[mask] + 1); } } } cout << dp[(1 << n) - 1] << endl; } return 0; } -
1
#include <cmath> #include <vector> using namespace std; const double eps = 1e-10; int main() { int T; cin >> T; while (T--) { int n, m; cin >> n >> m; vector<double> x(n), y(n); for (int i = 0; i < n; i++) { cin >> x[i] >> y[i]; } vector<int> covers; for (int i = 0; i < n; i++) { covers.push_back(1 << i); } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double x1 = x[i], y1 = y[i]; double x2 = x[j], y2 = y[j]; double denom = x1 * x2 * (x1 - x2); if (fabs(denom) < eps) continue; double a = (y1 * x2 - y2 * x1) / denom; double b = (y1 - a * x1 * x1) / x1; if (a >= -eps) continue; int cover = 0; for (int k = 0; k < n; k++) { if (fabs(a * x[k] * x[k] + b * x[k] - y[k]) < eps) { cover |= (1 << k); } } if (cover) { covers.push_back(cover); } } } vector<int> dp(1 << n, n + 1); dp[0] = 0; for (int mask = 0; mask < (1 << n); mask++) { if (dp[mask] > n) continue; int rest = ((1 << n) - 1) ^ mask; if (!rest) continue; int low = __builtin_ctz(rest); for (int c : covers) { if (c & (1 << low)) { int nmask = mask | c; dp[nmask] = min(dp[nmask], dp[mask] + 1); } } } cout << dp[(1 << n) - 1] << endl; } return 0; } -
1
#include <cmath> #include <vector> using namespace std; const double eps = 1e-10; int main() { int T; cin >> T; while (T--) { int n, m; cin >> n >> m; vector<double> x(n), y(n); for (int i = 0; i < n; i++) { cin >> x[i] >> y[i]; } vector<int> covers; for (int i = 0; i < n; i++) { covers.push_back(1 << i); } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double x1 = x[i], y1 = y[i]; double x2 = x[j], y2 = y[j]; double denom = x1 * x2 * (x1 - x2); if (fabs(denom) < eps) continue; double a = (y1 * x2 - y2 * x1) / denom; double b = (y1 - a * x1 * x1) / x1; if (a >= -eps) continue; int cover = 0; for (int k = 0; k < n; k++) { if (fabs(a * x[k] * x[k] + b * x[k] - y[k]) < eps) { cover |= (1 << k); } } if (cover) { covers.push_back(cover); } } } vector<int> dp(1 << n, n + 1); dp[0] = 0; for (int mask = 0; mask < (1 << n); mask++) { if (dp[mask] > n) continue; int rest = ((1 << n) - 1) ^ mask; if (!rest) continue; int low = __builtin_ctz(rest); for (int c : covers) { if (c & (1 << low)) { int nmask = mask | c; dp[nmask] = min(dp[nmask], dp[mask] + 1); } } } cout << dp[(1 << n) - 1] << endl; } return 0; }
- 1
信息
- ID
- 764
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 59
- 已通过
- 14
- 上传者