数列极差

三世轮回 提交于 2020-01-25 18:11:44

数列极差

题目描述

佳佳的老师在黑板上写了一个由n个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的
两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数为止,在所有按这
种操作方式最后得到的数中,最大的为max,最小的为 min, 则该数列的极差定义为M=max−min。

由于佳佳忙于准备期末考试,现请你帮助他,对于给定的数列,计算出相应的极差M。

 

输入

第一行为一个正整数n表示正整数序列的长度;
在接下来的n行中,每行输入一个正整数。
接下来的一行有一个0,表示数据结束。

输出

输出只有一行,为相应的极差d。

 

样例输入

3
1
2
3
0

 

样例输出

2

题解:

首先这个题如果拿出几个测试案例来看的话,容易推导出这是一道贪心题,就拿本题的测试案例
来看,1 2 3 这三个数有三种不同的操作顺序
1:(1*2+1)*3+1=10
2:(1*3+1)*2+1=9

3:(2*3+1)*1+1=8

从中我们容易发现这样的顺序,如果要求最大值的话,那么每次先用最小的连个数相乘的结果+1,相
反,如果要求最小值的话,每次先用最大的两个数相乘的结果+1.这样我们就可以写算法啦

 

提示

对于全部数据,0≤n≤50000,保证所有数据计算均在32位有符号整数范围内。

源代码:

#include<bits/stdc++.h>
using namespace std;
int s[500021],j[500021],n;
int cmp(int a,int b) {
    return a>b;
}
int main() {
    while(cin>>n&&n!=0) {
        for(int i=0; i<n; i++) {
            cin>>s[i];
            j[i]=s[i];
        }
        sort(s,s+n);
        for(int i=1; i<n; i++) {
            s[i]=s[i]*s[i-1]+1;
            sort(s+i,s+n);
        }
        int max=s[n-1];
        sort(j,j+n,cmp);
        for(int i=1; i<n; i++) j[i]=j[i-1]*j[i]+1;
        int min=j[n-1];
        cout<<max-min<<endl;
    }
    return 0;
}

AC

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!