网易疯狂队列

原创 2017年08月17日 22:18:05

题目来源:

题目描述:

小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。 


输入描述:
输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数
第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高


输出描述:
输出一个整数,表示n个学生列队可以获得的最大的疯狂值。

如样例所示: 
当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。
这是最大的疯狂值了。

输入例子1:
5
5 10 25 40 25

输出例子1:
100

解析:

规律题,首先对数组从小到大排序。例如:


1、先排最大值。

2、然后在最大的两端分别插入当前最小的两个值,小的向后插入,大的向前插入。

3、然后在两端分别插入当前最大的两个值,大的向后插入,小的向前插入。

4、重复2、3,直至所有的数据全部插入。如下:


5、微调数据(对于相等元素较多的情况,如下)。


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

using namespace std;

deque <int> q;//双端队列

int main()
{
    int n, a;
    vector <int> arr;
    cin>>n;
    for(int i = 0; i < n; ++i)
    {
        cin>>a;
        arr.push_back(a);
    }

    sort(arr.begin(), arr.end());


    q.push_back(arr[n-1]);

    int j = n-2, num = 1;
    int i = 0;
    while(num < n)
    {
        if(num >= n)
            break;
        if(num < n)//两端分别插入当前最小的两个值,小的向后插入,大的向前插入
        {
            q.push_back(arr[i++]);
            num++;
            if(num >= n)
                break;
            q.push_front(arr[i++]);
            num++;
        }
        if(num < n)//两端分别插入当前最大的两个值,大的向后插入,小的向前插入
        {
            q.push_back(arr[j--]);
            num++;
            if(num >= n)
                break;
            q.push_front(arr[j--]);
            num++;
        }
    }

    int sum = 0;
    /**
       original                   10 10 10 20 20 50 50

                              ---> 20 20 10 50 10 50 10    ===> 170

    mv first to last position ---> 20 10 50 10 50 10 20    ===> 180
    */
    if(abs(q[0] - q[1]) < abs(q[n-1] - q[0]))//对于相等的数很多的时候,会有上例情况出现,所以要调整一下
    {
        q.push_back(q.front());
        q.pop_front();
    }
    for(int i = 1; i < n; ++i)
    {
        sum += abs(q[i] - q[i-1]);
    }

    cout<<sum<<endl;
    return 0;
}





版权声明:本文为博主原创文章,转载需注明出处。

疯狂Java学习笔记(88)-----------值得拥有的10本书

Java是时下最流行的编程语言之一。市面上也出现了适合初学者的大量书籍。但是对于那些在Java编程上淫浸多时的开发人员而言,这些书的内容未免显得过于简单和冗余了。那些适合初学者的书籍看着真想打瞌睡,有...
  • u011225629
  • u011225629
  • 2015年06月18日 08:51
  • 1778

学完分享:李刚《疯狂JAVA讲义》学习笔记思维导图版

李刚老师的《疯狂JAVA讲义》厚达800多页,如果不做任何笔记并将知识体系化,很难将里面的知识内化成自己的东西。我在三个月的学习过程中,不但认真完成里面的实验,而且细心梳理了知识结构,并通过思维导图软...
  • midong2000
  • midong2000
  • 2013年12月28日 15:58
  • 3012

java基础学习(6)疯狂java讲义第5章课后习题解答源码

1class Students{ // define member variable private int age; private String name,gender,p...
  • yywan1314520
  • yywan1314520
  • 2016年07月22日 16:28
  • 2300

网易队列输出1,2,3...n

小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序: while(!Q.empty()) //队列不空,执行循环 { in...
  • qq_36092584
  • qq_36092584
  • 2016年09月12日 00:25
  • 188

网易有道编程题:恢复队列

网易有道编程题:恢复队列题目详情:给出一个含有n个元素的队列,其内容为1到n的无序整数,按照给定算法输出该队列,使得该队列依次输出1,2,3,…,n-1,n。...
  • lmq_begood
  • lmq_begood
  • 2016年08月17日 22:22
  • 289

网易有道编程题:恢复队列(C++)

题目:小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序: while(!Q.empty()) //队列不空,执行循环 { ...
  • lxubin
  • lxubin
  • 2016年08月18日 10:01
  • 2269

网易有道2017内推编程题:构造队列 [python]

''' [编程题] 构造队列 时间限制:1秒 空间限制:32768K 小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序: while(!Q.empty...
  • qq_34617032
  • qq_34617032
  • 2017年11月22日 09:14
  • 43

2017网易有道编程题:构造队列

原题如下: 小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序: while(!Q.empty()) //队列不空...
  • a1103000308
  • a1103000308
  • 2016年08月24日 14:21
  • 423

“构造队列”的两种解法-网易有道17届校招内推在线笔试题

题目: 小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序: while(!Q.empty()) //队列不空,执行循环{int x...
  • y999666
  • y999666
  • 2016年08月24日 16:43
  • 1409

网易视频云分享:消息队列设计中如何保证同一用户的消息按序处理

消息队列是应用开发的常用工具, 也是系统解耦的必备利器。保证同一用户的消息按照顺序处理是应用的常见需求,  譬如在微博应用中,发表微博、删除微博这两个操作必须按序处理,乱序势必造成业务逻辑错误。   ...
  • vcloud_163
  • vcloud_163
  • 2016年06月03日 15:26
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网易疯狂队列
举报原因:
原因补充:

(最多只允许输入30个字)