列表

详情


NC50166. 数列极差

描述

佳佳的老师在黑板上写了一个由n个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数,如此下去直至黑板上剩下一个数为止,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为
由于佳佳忙于准备期末考试,现请你帮助他,对于给定的数列,计算出相应的极差M。

输入描述

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

输出描述

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

示例1

输入:

3
1
2
3
0

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 476K, 提交时间: 2020-05-03 09:10:51

#include<iostream>
#include<algorithm>
using namespace std;
int s[50001];
int j[50001];
int cmp(int a,int b){return a>b;}
int main()
{
	int n;
	while(cin>>n&&n)
	{
	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;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 440K, 提交时间: 2021-11-25 15:05:37

#include<bits/stdc++.h>
using namespace std;
int n;
int a[50005],b[50005];
int main()
{
	cin>>n;
	for(int i=1;i<=n+1;i++)
	{
		cin>>a[i];
		b[i]=a[i];
	}
	int x=1;
	while(x!=n-1)
	{
		sort(a+x,a+1+n);
		a[x+1]=a[x]*a[x+1]+1;
		x++;
	}
	x=n;
	sort(b+1,b+1+x);
	while(x!=2)
	{
		b[x-1]=b[x-1]*b[x]+1;
		x--;
    }
    cout<<a[n]*a[n-1]-b[1]*b[2];
	return 0;
	
}

Python3(3.5.2) 解法, 执行用时: 16ms, 内存消耗: 3348K, 提交时间: 2020-08-22 21:44:23

n=int(input())
a=[]
b=[]
for i in range(n):
    a.append(int(input()))
b=a
a=sorted(a,reverse=False)
b=sorted(b,reverse=True)
for i in range(1,n):
    a[i]=a[i]*a[i-1]+1
    b[i]=b[i]*b[i-1]+1
    a=a[:i]+sorted(a[i:],reverse=False)
    b=b[:i]+sorted(b[i:],reverse=True)
maxn=a[-1]
minn=b[-1]
print(maxn-minn)

上一题