http://www.nowcoder.com/questionTerminal/54868056c5664586b121d9098d008719

题目难度:二星
考察点:贪心、模拟

方法:贪心、模拟

  1. 分析:
    我们分析一下题意,如果想尽可能的让塔的不稳定性小的话,那么就需要让最高塔高度与最低塔高度的差尽可能低,也就是让最高塔的高度尽可能低,最低塔的高度尽可能高。那么我们每次进行操作的时候就是首先将整个高度数组按照从小到大进行排序,然后高度最大值-1,高度最小值+1。一直循环k次, 在每次进行操作的时候分别记录最大值和最小值即可。还需要注意的一点是如果高度最大值-高度最小值<=1的时候,此时就不需要进行操作了,因为此时操作是完全多余的,而题目让我们求的是最少操作次数。
    举个例子:
    就拿样例来说,我们可以进行两次操作:
    第一次操作:我们首先将高度数组排序变为:
    5, 5, 8
    将高度最大值减1,最小值加1,同时记录操作数组的下标(2, 1)此时高度数组变为:
    6, 5, 7
    第二次操作:在将高度数组进行排序,得到:
    5,6,7
    然后将高度最大值减1,最小值加1,同时记录操作数组的下标(2, 3),注意此时的下标并不是排序之后的下标,是原先高度数组的下标,此时高度数组变为:
    6, 6, 6
    进行完两次操作之后,此时不稳定度达到最小,最小为0。然后输出操作数组下标:
    (2, 1)
    (2, 3)

算法实现:
(1). 首先用一个结构体数组保存高度值和下标。
(2). 然后进行k次循环,在每次循环种,首先对结构体数组进行排序,排序规则按照高度值从小到大。排序之后判断高度最大值-高度最小值是否小于等于1,如果小于等于1的话就直接退出此次循环,然后输出结果。否则,将高度最大值-1,高度最小值+1,同时记录此次高度最大值和最小值的下标。
(3). 在执行完k次循环之后,我们在输出高度最大值和最小值的差,此时的差就是不稳定度最小的。然后在根据之前保留的操作数组,输出即可。

  1. 复杂度分析:
    时间复杂度:O(k*nlog(n))
    空间复杂度:O(max(n, k))

  2. 代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1e2+5;
    struct Node {
     int x, y;
    }a[MAXN], b[MAXN*10];
    bool cmp(Node A, Node B) {
     return A.x < B.x;
    }
    int main() {
     int n, k; cin>>n>>k;
     for(int i=0; i<n; i++) {
         cin>>a[i].x;
         a[i].y = i+1;
     }
     int cnt = 0;
     while(k--) {
         sort(a, a+n, cmp);
         if(a[n-1].x-a[0].x <= 1) break;
         a[0].x++;
         a[n-1].x--;
         b[cnt].x = a[n-1].y;
         b[cnt++].y = a[0].y;
     }
     sort(a, a+n, cmp);
     cout<<a[n-1].x-a[0].x<<" "<<cnt<<endl;
     for(int i=0; i<cnt; i++) cout<<b[i].x<<" "<<b[i].y<<endl;
     return 0;
    }
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
07-05 16:23
门头沟学院 Java
mengnankk:我投了300,约了5 6个面试。感觉项目写的太多了。一个项目就写五六个亮点,不是把整个项目的功能描述下。其他的没啥,简历看起来有点长
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务