小易有一些立方体,每个立方体的边长为1,他用这些立方体搭了一些塔。
现在小易定义:这些塔的不稳定值为它们之中最高的塔与最低的塔的高度差。
小易想让这些塔尽量稳定,所以他进行了如下操作:每次从某座塔上取下一块立方体,并把它放到另一座塔上。
注意,小易不会把立方体放到它原本的那座塔上,因为他认为这样毫无意义。
现在小易想要知道,他进行了不超过k次操作之后,不稳定值最小是多少。
第一行两个数n,k (1 <= n <= 100, 0 <= k <= 1000)表示塔的数量以及最多操作的次数。
第二行n个数,ai(1 <= ai <= 104)表示第i座塔的初始高度。
第一行两个数s, m,表示最小的不稳定值和操作次数(m <= k)
接下来m行,每行两个数x,y表示从第x座塔上取下一块立方体放到第y座塔上。
3 2 5 8 5
0 2 2 1 2 3
每次从最高的塔上拿下一个立方体,放在最低的塔上。进行k次,并在容器中记录每一次调整后塔群的不稳定值和具体的移动操作。
得到k次操作的不稳定值后,找到最小值对应的索引minIndex,输出前minIndex个移动操作即可。
import java.io.*; import java.util.*; class Node { int id; int height; public Node(int id, int height) { this.id = id; this.height = height; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().split(" "); int n = Integer.parseInt(params[0]), k = Integer.parseInt(params[1]); String[] strs = br.readLine().split(" "); Node[] tower = new Node[n]; for(int i = 0; i < n; i++){ int height = Integer.parseInt(strs[i]); tower[i] = new Node(i, height); } int[] minmax = getMinMax(tower); ArrayList<String> ops = new ArrayList<>(); ArrayList<Integer> unsteady = new ArrayList<>(); unsteady.add(tower[minmax[1]].height - tower[minmax[0]].height); while(k-- > 0){ ops.add((tower[minmax[1]].id + 1) + " " + (tower[minmax[0]].id + 1)); tower[minmax[1]].height--; tower[minmax[0]].height++; minmax = getMinMax(tower); unsteady.add(tower[minmax[1]].height - tower[minmax[0]].height); } int min = unsteady.get(0), index = 0; for(int i = 1; i < unsteady.size(); i++){ if(unsteady.get(i) < min){ index = i; min = unsteady.get(i); } } if(index == 0){ System.out.println(min + " " + index); }else{ System.out.println(min + " " + index); for(int i = 0; i < index; i++){ System.out.println(ops.get(i)); } } } private static int[] getMinMax(Node[] tower) { int minIndex = 0, maxIndex = 0, min = tower[0].height, max = tower[0].height; for(int i = 1; i < tower.length; i++){ if(tower[i].height < min){ min = tower[i].height; minIndex = i; } if(tower[i].height > max){ max = tower[i].height; maxIndex = i; } } return new int[]{minIndex, maxIndex}; } }
import java.util.Scanner; import java.util.ArrayList; public class Main { public static void main(String[] args ){ Scanner sc = new Scanner(System.in); int n = sc.nextInt();int k = sc.nextInt(); int[]ai = new int[n]; for(int i=0;i<n;++i) ai[i] = sc.nextInt(); int maxIndex = max(ai); int minIndex = min(ai); ArrayList<String> motion = new ArrayList<>(); for(int i=0;i<k;++i) { if(ai[maxIndex]>ai[minIndex]) { motion.add(ai[maxIndex]+" "+ai[minIndex]); --ai[maxIndex]; ++ai[minIndex]; maxIndex = max(ai); minIndex = min(ai); } else{ break; } } System.out.println( (ai[maxIndex]-ai[minIndex])+" "+(motion.size())); for(String value:motion) { System.out.println(value); } } public static int max(int[]p) { int max=Integer.MIN_VALUE; int pos=0; for(int i=0;i<p.length;++i) { if(p[i]>max) { max = p[i]; pos = i; } } return pos; } public static int min(int[]p) { int min = Integer.MAX_VALUE; int pos=0; for(int i=0;i<p.length;++i) { if(p[i]<min) { min = p[i]; pos = i; } } return pos; } } AC
import java.util.*; public class Main{ //思路和很多大佬差不多: //(1)每次用最高塔减一,最低塔加一 //(2)约束条件为最高塔与最低塔的差<=1,或者操作次数大于最大操作次数 public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt();//输入塔的数量 int k = sc.nextInt();//最多操作的次数 int[] heightOfTa = new int[n];//每座塔的初始高度 for(int i = 0; i < n; i++){ heightOfTa[i] = sc.nextInt(); } ArrayList<Integer> list1 = new ArrayList<Integer>(); ArrayList<Integer> list2 = new ArrayList<Integer>(); int count = 0;//操作次数 for(int i = 0; i < k; i++){ //找到最高塔所在的下标 int max = findMax(heightOfTa); //找到最低塔所在的下标 int min = findMin(heightOfTa); //判断是否达到约束条件:(1)最高与最低塔之间最多相差1;(2)操作次数大于最大操作次数 if(arriveGoal(heightOfTa[max], heightOfTa[min]) || count > k){ break; } count++;//操作次数加1 heightOfTa[max]--;//最高塔放一个立方体到最低塔,高度减一 heightOfTa[min]++;//同时最低塔得到一个立方体,高度加一 list1.add(max + 1);//存放当前操作的下标便于输出,加一是因为原始下标是从0开始 list2.add(min + 1); } System.out.println(heightOfTa[findMax(heightOfTa)] - heightOfTa[findMin(heightOfTa)] + " " + count); for(int i = 0; i < list1.size(); i++){ System.out.println(list1.get(i) + list2.get(i)); } } //寻找最高塔所在下标 public static int findMax(int[] heightOfTa){ int max = heightOfTa[0]; int maxIndex = 0; for(int i = 0; i < heightOfTa.length; i++){ if(max < heightOfTa[i]){ maxIndex = i; max = heightOfTa[i]; } } return maxIndex; } //寻找最低塔所在下标 public static int findMin(int[] heightOfTa){ int min = heightOfTa[0]; int minIndex = 0; for(int i = 0; i < heightOfTa.length; i++){ if(min > heightOfTa[i]){ minIndex = i; min = heightOfTa[i]; } } return minIndex; } //判断是否达到目标条件 public static boolean arriveGoal(int h1, int h2){ boolean isArrive = false; if(h1 - h2 <= 1){ isArrive = true; } return isArrive; } }
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** *思路:找到数组中最大的和最小的,将最大的减一给最小的加一,这样即为一次操作,遍历 k 直至结束,或达到最稳定状态后提前退出,所以输出的 k 不一定等于给定的 k */ public class Main{ public static void main(String[]args){ //所有录入 Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int a[] = new int[n]; for(int i = 0; i < n; i++){ a[i] = sc.nextInt(); } //找出最小和最大,最大的减一,最小的加一 findmin(a,n,k); } private static void findmin(int[] a,int n,int k){ if(a.length > 0){ int i; // l1 发送塔,送一个立方体给 l2 List<Integer> l1 = new ArrayList<Integer>(); // l2 是接收塔,从 l1 收到一个立方体 List<Integer> l2 = new ArrayList<Integer>(); int max = 0, min = 0; for( i = 0; i < k; i++){ max = 0; min = 0; for(int j = 0; j < n; j++){ if(a[j] > a[max]){ max = j; } if(a[j] < a[min]){ min = j; } }//可能在k次数内就已经达到最大稳定,可以提前结束 if(a[max] - a[min] < 1){ break; }else{ a[max]--; a[min]++; //最大和最小的位置记录下来,一会输出 l1.add(max+1); l2.add(min+1); } } //以上代码最后一次执行后,最大值最小值都变了,所以重新找到最大最小值,然后输出 min=0; max=0; for(int m=0;m<n;m++){ if(a[m]>a[max]) { max=m; } if(a[m]<a[min]){ min=m; } } System.out.println((a[max]-a[min]) +" "+i); for(int k1 = 0; k1 < l1.size(); k1++){ System.out.println(l1.get(k1)+" " + l2.get(k1)); } } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader buffer=new BufferedReader(new InputStreamReader(System.in)); String[] str1=buffer.readLine().split(" "); int towerNum=Integer.parseInt(str1[0]); int maxMoveNum=Integer.parseInt(str1[1]); String[] str2=buffer.readLine().split(" "); int[] towerInit=new int[towerNum]; for(int i=0;i<towerNum;i++){ towerInit[i]=Integer.parseInt(str2[i]); } int highTower=countMax(towerInit); int lowTower=countMin(towerInit); int m=0; int highIndex=0,lowIndex=0; int[][] move=new int[maxMoveNum][2]; for(int i=0;i<maxMoveNum;i++){ for(int j=0;j<towerNum;j++){ if(highTower<=towerInit[j]){ highIndex=j; highTower--; break; } } for(int j=0;j<towerNum;j++){ if(lowTower>=towerInit[j]){ lowIndex=j; lowTower++; break; } } towerInit[highIndex]--; towerInit[lowIndex]++; highTower=countMax(towerInit); lowTower=countMin(towerInit); m++; move[i][0]=highIndex+1; move[i][1]=lowIndex+1; if(highTower-lowTower<=1){ break; } } System.out.println((highTower-lowTower)+" "+m); for(int k=0;k<m;k++){ System.out.println(move[k][0]+" "+move[k][1]); } } private static int countMax(int[] arrays){ int max=arrays[0]; for(int i=0;i<arrays.length;i++){ if(max<arrays[i]){ max=arrays[i]; } } return max; } private static int countMin(int[] arrays){ int min=arrays[0]; for(int i=0;i<arrays.length;i++){ if(min>arrays[i]){ min=arrays[i]; } } return min; } }
import java.util.*; public class Main { static class Tower { int height; int index; public Tower(int height, int index) { this.height = height; this.index = index; } } public static class TowerComparator implements Comparator<Tower> { public int compare(Tower t1, Tower t2) { return t1.height - t2.height; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); Tower[] towers = new Tower[n]; for (int i = 0; i < n; i++) { towers[i] = new Tower(sc.nextInt(), i + 1); } List<String> lists = new ArrayList<>(); Arrays.sort(towers, new TowerComparator()); int count = 0; while (towers[n - 1].height - towers[0].height > 0 && k > 0) { towers[n - 1].height--; towers[0].height++; k--; count++; lists.add(towers[n - 1].index + " " + towers[0].index); Arrays.sort(towers, new TowerComparator()); } System.out.println((towers[n - 1].height - towers[0].height) + " " + count); for (int i = 0; i < lists.size(); i++) { System.out.println(lists.get(i)); } } }