1 条题解
-
0
题意分析
我们需要找到一种方法来锯掉圆桌周围等距分布的腿的最小总长度,使得桌子能够平稳放置在平面上。
解题思路
圆桌的腿等距分布,因此只要有三个或更多的腿在同一平面上且不共线,桌子就能平稳放置。我们需要找到一组腿,使得它们的长度相同,并且这些腿中任意三个都不共线,同时锯掉其他腿的总长度最小。如果有三个或更多的腿长度相同,并且它们中任意三个都不共线,那么这些腿可以支撑桌子。我们需要找到这样的最大腿集合,使得锯掉其他腿的总长度最小。
标程
#include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; int main() { int t; bool first = true; while (cin >> t && t != 0) { if (!first) { cout << endl; } first = false; vector<int> legs(t); for (int i = 0; i < t; ++i) { cin >> legs[i]; } sort(legs.begin(), legs.end()); int total_sum = 0; for (int leg : legs) { total_sum += leg; } int min_cut = INT_MAX; int current_length = legs[0]; int current_count = 1; for (int i = 1; i < t; ++i) { if (legs[i] == current_length) { current_count++; } else { if (current_count >= 3) { int current_cut = total_sum - current_length * current_count; if (current_cut < min_cut) { min_cut = current_cut; } } current_length = legs[i]; current_count = 1; } } if (current_count >= 3) { int current_cut = total_sum - current_length * current_count; if (current_cut < min_cut) { min_cut = current_cut; } } if (min_cut == INT_MAX) { min_cut = total_sum - legs.back() * 1; } cout << min_cut << endl; } return 0; }
- 1
信息
- ID
- 1629
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者