数列极差
题目描述
佳佳的老师在黑板上写了一个由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
来源:CSDN
作者:Abby•Jason
链接:https://blog.csdn.net/m0_45682806/article/details/104065705