Ants
题意:给出n堆食物以及n只蚂蚁的二维位置,问怎么分配蚂蚁以及食物,使得任意两只蚂蚁走的路线(直线)不会出现交点
解法:其实仔细思考就会发现,蚂蚁走距离最短的距离就不会出现相交,因为如果两只蚂蚁路线相交,那么他们互换食物的距离会更短(三角形两边之和大于第三边),利用这点就可以做了
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
double a[200][2], b[200][2], k1, k2;
int n, ans[200] = {0}, t[200] = {0};
bool f[200] = {0};
double sqr(double x) {
return x*x;
}
int main() {
freopen("ants.in","r",stdin);
freopen("ants.out","w",stdout);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i][0] >> a[i][1];
for (int i = 1; i <= n; i++)
cin >> b[i][0] >> b[i][1];
for (int i = 1; i <= n; i++)
ans[i] = i;
ans[0] = 1e9;
bool flag;
while (1) {
flag = true;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) if (i != j) {
double len1 = sqrt(sqr(a[i][0]-b[ans[i]][0])+sqr(a[i][1]-b[ans[i]][1]))
+ sqrt(sqr(a[j][0]-b[ans[j]][0])+sqr(a[j][1]-b[ans[j]][1]));
double len2 = sqrt(sqr(a[i][0]-b[ans[j]][0])+sqr(a[i][1]-b[ans[j]][1]))
+ sqrt(sqr(a[j][0]-b[ans[i]][0])+sqr(a[j][1]-b[ans[i]][1]));
if (len1-len2 > 1e-9) {
flag = false;
swap(ans[i], ans[j]);
}
}
if (flag) break;
}
for (int i = 1; i <= n; i++)
cout << ans[i] << endl;
fclose(stdin);fclose(stdout);
}