3 条题解

  • 1
    @ 2026-8-25 16:19:05
    #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
      @ 2026-8-25 16:18:20
      #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
        @ 2026-8-25 16:02:24
        #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
        上传者