小易有一些立方体,每个立方体的边长为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));
}
}
}