1 条题解
-
0
题意分析
给定 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
- 上传者