2019校招真题编程(十四)塔

92 篇文章 0 订阅

题目描述

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

存在:左右一直不能平衡的问题;计算max 和min的差值,看操作后两者是否相同;

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

pair<int, int>FindNums(vector<int>A)
{
    int len = A.size();
    if(len<=0) return make_pair(0,0);
    int maxValue=0, minValue=0;
    for(int i=1; i<len; i++)
    {
        maxValue = A[maxValue]>=A[i]?maxValue:i;
        minValue = A[minValue]<=A[i]?minValue:i;
    }
    return make_pair(minValue, maxValue);
}

int main()
{
    int n,k;
    cin>>n>>k;
    vector<int>A(n, 0);
    for(int i=0; i<n; i++)
    {
        cin>>A[i];
    }
    int s=0, m=1;
    vector<vector<int>>ans;
    pair<int, int>op = FindNums(A);
    while( (m<=k) && (A[op.second] - A[op.first] >1))
    {
        A[op.second] -= 1;
        A[op.first] += 1;
        vector<int>tmp; tmp.push_back(op.second); tmp.push_back(op.first);
        ans.push_back(tmp);
        op = FindNums(A);
        m++;
    }
    s = A[op.second] - A[op.first];
    if(m>k) m=m-1;
    cout<<s<<" "<<m<<endl;
    for(int i=0; i<ans.size(); i++)
        cout<<ans[i][0]+1<<" "<<ans[i][1]+1<<endl;

    return 0;
    
}

运行时间:6ms

占用内存:404k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值