题意:有八个乘客坐在直升机上,求重心M最小值。
思路:根据题目所给的公式,我们可以知道要使得M最小,也就是要使得Mv和Mh的和最小,我们可以使用全排列,分别将每个值放在各个位子上,然后更新最小值。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; int a[8]; int main() { while (1) { for (int i = 0; i < 8; i++) scanf("%d", &a[i]); if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5] && !a[6] && !a[7]) break; sort(a, a + 8); double Min = INF; do{ double mv, mh, m; double x1, x2, y1, y2; x1 = a[5] + a[6] + a[7]; x2 = a[0] + a[1] + a[2]; y1 = a[2] + a[4] + a[7]; y2 = a[0] + a[3] + a[5]; mv = pow((x1 - x2), 2); mh = pow((y1 - y2), 2); m = sqrt(mv + mh); if (Min > m) Min = m; } while(next_permutation(a, a + 8)); printf("%.3lf\n", Min); } return 0; }
UVA1523-Helicopter(暴力+全排列)
时间: 2024-10-08 11:22:52