poj1723

来源:互联网 发布:mac没有host 编辑:程序博客网 时间:2024/06/03 14:58

poj1723

先把所有的士兵移动到y= 的一条水线上(关键是找中位数,和王晓东的算法设计与分析2-1一样,求所有y坐标到中位数的和,可以排序后一下求出,但我的代码中不是这样求的),然后再考虑如何移动士兵使其挨着又不同时在一个位置。

比如排列在a, a+1, a+2, a+3,.....

先把横坐表从小到大排序sort();

x[i] -> a+i; 在x[i]位置的士兵移动到 a + i;

计算移动距离:x[i] - (a + i)    0<= i < n; (n个士兵)

转化为 对(x[i] - i)- a    0 <= i < n 求和。相当于求(x[i] - i)到中位数的距离和。

把水平竖直两方向的移动距离加到一起就好了。吐舌头zzuwenjie 2017-3-11 12:06:28

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 20000+7;int arrayNum[maxn];int x[10000+7];int y[10000+7];int main(){    int n;    while (~scanf("%d", &n)){        memset(arrayNum, 0, sizeof arrayNum);        for (int i = 0; i < n; ++i){            scanf("%d%d",&x[i], &y[i]);            arrayNum[y[i] + 10000]++;        }        int mid = (n + 1) / 2, midNum = 0;        for (int i = 20000; i >= 0; --i){            mid -= arrayNum[i];            if (mid <= 0){                midNum = i - 10000;                break;            }        }        int sum = 0;        sort(x, x + n);        for (int i = 0; i < n; ++i){            x[i] -= i;        }        sort(x, x + n);        int midNUmX = x[n / 2];        //cout <<"start = " << start << endl;        for (int i = 0; i < n; ++i){            sum += abs(y[i] - midNum) + abs(x[i] - midNUmX);        }        printf("%d\n", sum);    }    return 0;}


0 0
原创粉丝点击