经过杭师大校赛的打击,明白了数学知识的重要性
开始学习数论,开始找题练手
Herding
InputThe first line contains the number of test cases T( T<=25 ). Following lines are the scenarios of each test case.
The first line of each test case contains one integer N( 1<=N<=100 ). The following N lines describe the coordinates of the trees. Each of these lines will contain two float numbers Xi and Yi( -1000<=Xi, Yi<=1000 ) representing the coordinates of the corresponding tree. The coordinates of the trees will not coincide with each other.OutputFor each test case, please output one number rounded to 2 digits after the decimal point representing the area of the smallest region. Or output "Impossible"(without quotations), if it do not exists such a region.Sample Input
1 4 -1.00 0.00 0.00 -3.00 2.00 0.00 2.00 2.00
Sample Output
2.00
题意:给出几个点的坐标,求能围成的最小的面积。
思路:多边形都能分割成各种三角形,三角形是最小面积,利用叉乘解决,高中知识(枯了,早忘记了),两个向量叉乘的绝对值除以二就能得出三角形面积
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<iterator> #include<sstream> #include<string> #include<queue> #include<vector> #include<map> #include<set> using namespace std; #define inf 0x3f3f3f3f int T; int n; double ans, temp; double ac_x, ac_y, bc_x, bc_y; double x[1010], y[1010]; int main() { cin >> T; while (T--) { ans = inf; cin >> n; for (int i = 1; i <= n; i++) { cin >> x[i]; cin >> y[i]; } for (int i = 1; i <= n; i++) { for(int j=i+1;j<=n;j++){ for (int k = j + 1; k <= n; k++) { ac_x = x[k] - x[i]; ac_y = y[k] - y[i]; bc_x = x[k] - x[j]; bc_y = y[k] - y[j]; temp = fabs(ac_x*bc_y - ac_y * bc_x); if (temp == 0) { continue; } ans = min(ans, temp / 2); } } } if (ans == inf) { cout << "Impossible" << endl; } else { printf("%.2lf\n", ans); } } return 0; }