1 条题解

  • 0
    @ 2025-6-20 17:06:44

    题意分析

    给定 K 个半圆形钢丝(半径a1,a2,...,aK半径 a₁, a₂, ..., a_K),每个钢丝可在端点处以任意角度焊接。需要判断是否能选择部分钢丝(至少两根)组成一个简单连通的闭合图形,且钢丝不得相交。

    解题思路

    将每个半径乘以 1000 并四舍五入转为整数,避免浮点误差。枚举所有非空子集(使用位掩码) 找到满足条件的子集立即输出 "YES"

    枚举完所有子集仍未找到则输出 "NO"

    标程

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    
    int main() {
        int K;
        while (cin >> K && K != 0) {
            vector<double> a(K);
            for (int i = 0; i < K; i++) {
                cin >> a[i];
            }
            vector<long long> b(K);
            for (int i = 0; i < K; i++) {
                b[i] = (long long)(a[i] * 1000.0 + 0.5);
            }
    
            bool found = false;
            for (int mask = 1; mask < (1 << K); mask++) {
                int cnt = 0;
                long long sum_val = 0;
                long long max_val = 0;
                for (int i = 0; i < K; i++) {
                    if (mask & (1 << i)) {
                        cnt++;
                        sum_val += b[i];
                        if (b[i] > max_val) {
                            max_val = b[i];
                        }
                    }
                }
                if (cnt < 2) continue;
                if (2 * max_val <= sum_val) {
                    found = true;
                    break;
                }
            }
    
            if (found) {
                cout << "YES" << endl;
            } else {
                cout << "NO" << endl;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1640
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者