题意:有八个乘客坐在直升机上,求重心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 ", Min); } return 0; }