Ants

来源:互联网 发布:淘宝宝贝详情源代码 编辑:程序博客网 时间:2024/05/16 07:49

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);}
0 0
原创粉丝点击