题目描述
小易有一些立方体,每个立方体的边长为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座塔上。示例1
输入3 2
5 8 5输出
0 2
2 1
2 3
解题思路
从塔高度中选取最高和最低的,判断高度差是否超过1并且调整次数是否小于k,如果是的话,输出对应的索引,然后将最高的塔高度减1,最低的塔高度加1,再次循环即可,
参考代码
#include <iostream>
#include <vector>
using namespace std;
int minIndex(int a[],int n){
int index = 0;
int tmp = a[0];
for(int i = 0;i < n;i++){
if(a[i] < tmp){
tmp = a[i];
index = i;
}
}
return index;
}
int maxIndex(int a[],int n){
int index = 0;
int tmp = a[0];
for(int i = 0;i < n;i++){
if(a[i] > tmp){
tmp = a[i];
index = i;
}
}
return index;
}
int main(){
int n,k;
cin >> n >> k;
int *data = new int[n];
for(int i = 0;i < n;i++)
cin >> data[i];
int high,low,m;
high = maxIndex(data,n);
low = minIndex(data,n);
m = 0; //操作次数
vector<pair<int,int> > pass;
while(data[high] - data[low] > 1 && m < k){
m++;
data[high]--;
data[low]++;
pass.push_back(make_pair(high + 1,low + 1));
high = maxIndex(data,n);
low = minIndex(data,n);
}
//输出
cout << data[high] - data[low] << " " << m <<endl;
for(int i = 0;i < pass.size();i++){
cout << pass[i].first << " " << pass[i].second << endl;
}
return 0;
}