网易2018笔试题六

小易将n个棋子摆放在一张无限大的棋盘上。第i个棋子放在第x[i]行y[i]列。同一个格子允许放置多个棋子。每一次操作小易可以把一个棋子拿起并将其移动到原格子的上、下、左、右的任意一个格子中。小易想知道要让棋盘上出现有一个格子中至少有i(1 ≤ i ≤ n)个棋子所需要的最少操作次数.

import java.util.Arrays;
import java.util.Scanner;

public class Wangyif {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*解题思路:棋子只能横竖移动
         * 如果棋子起初都在一条线上,那么计算堆k个棋子的坐标就在这条线上
         * 思维扩散:不在一条线上的话,那么当做二维来看,那么这个最近距离的堆积点也会在某个棋子的的坐标上
         * */
        Scanner in= new Scanner(System.in);
        int total = in.nextInt();
        int x[] = new int[total];
        int y[] = new int[total];
        for(int i=0;i<total;i++){
            x[i] = in.nextInt();
        }
        for(int i=0;i<total;i++){
            y[i] = in.nextInt();
        }

        long result[] = new long[total];
        result[0] = 0;

        //记录x[j]y[k]到任一棋子的距离
        long distance[][][] = new long[total][total][total];
        for(int i=0;i<total;i++){
            for(int j=0;j<total;j++){
                for(int k=0;k<total;k++){
                    distance[j][k][i]=Math.abs(x[i]-x[j])+Math.abs(y[i]-y[k]);
                }
            }
        }

        //x[j]y[k]到任意棋子的距离进行排序,为了后面求k个棋子的最近距离
        for(int j=0;j<total;j++){
            for(int k=0;k<total;k++){
                Arrays.sort(distance[j][k],0,total);
            }
        }
        //取最小k个值求和,实际上也是距离x[j]y[k]最近的k个棋子距离之和
        for(int i=1;i<total;i++){
            long min = Long.MAX_VALUE;
            for(int j=0;j<total;j++){
                for(int k=0;k<total;k++){
                    long curdis=0;
                    for(int l=0;l<i+1;l++){
                        curdis+=distance[j][k][l];
                    }
                    min = Math.min(curdis,min);
                }
            }
            result[i] = min;
        }
        StringBuilder str = new StringBuilder();
        for(int i=0;i<total;i++){
            str.append(result[i]+" ");
        }
        str.deleteCharAt(str.length()-1);
        System.out.print(str);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值