堆棋子题解

堆棋子

http://www.nowcoder.com/questionTerminal/27f3672f17f94a289f3de86b69f8a25b

可以明确的是,所有备选格子的坐标必然在 x[]和y[]选取,优先可以计算出所有点到所有备选格子的距离,然后进行排序,使用前缀和可以快速取出每个备选格子包含不同棋子数的距离之和。最后取最小值即可。
时间复杂度 O(n^3logn)
空间复杂度 O(n)

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const int maxn = 55;
int x[maxn], y[maxn], n;
long dist[maxn], ans[maxn];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
    for (int i = 1; i <= n; i++) scanf("%d", &y[i]);
    memset(ans, 0x3f, sizeof(ans));

    // 目标点的坐标必然在x[], y[]中选取,所以最多有n*n个备选点
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) { 
            for (int k = 1; k <= n; k++) {
                dist[k] = abs(x[i]-x[k]) + abs(y[j]-y[k]);
            }
            sort(dist+1, dist+n+1);

            for (int i = 1; i <= n; i++) { 
                dist[i] += dist[i-1]; // default: dist[0] = 0;
                ans[i] = min(ans[i], dist[i]);
            }
        }
    }
    for (int i = 1; i <= n; i++)
        printf("%ld ", ans[i]);
    printf("\n");
    return 0;
}
全部评论

相关推荐

能干的三文鱼刷了100道题:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 14:35
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务