小易将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); } }