2019网易提前批笔试题-塔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38169413/article/details/82262630

题目描述

链接: https://www.nowcoder.com/questionTerminal/54868056c5664586b121d9098d008719?orderByHotValue=1&page=1&onlyReference=false

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

猜你喜欢

转载自blog.csdn.net/weixin_38169413/article/details/82262630