/*题目描述
题目描述
请输出数字序列的最大间隔。
请使用以下伪随机数生成函数 rand32 () 生成伪随机数
int seed ;
int rand(){ return((( seed = seed * 214013L + 2531011L) >> 16) & 0x7fff); }
int rand32(){
return ((rand() << 16) + (rand() << 1) + rand() % 2);
}
Input Format
2个整数,n seed 其中 2<n<=20000000,seed为随机数种子。
Output Format
整数序列的最大间隔
Example
Input
2000000
1
Output
15737
注意:O(nlogn)以上的时间复杂度至少会有一个案例超时。
样例输入输出
样例1
输入:
1959000 4910
输出:
16709*/
#include
using namespace std;
int n,seed;
int randI() {
return(((seed = seed * 214013L + 2531011L) >> 16) & 0x7fff);
}
int rand32() {
return ((randI() << 16) + (randI() << 1) + randI() % 2);
}
int maxGap(int arr[]) {
int maxGap=0;
int minN = arr[0], maxN = arr[0];
//遍历找到数组中最大值最小值。
for (int i = 0; i < n; ++i)
{
if (arr[i] > maxN)maxN = arr[i];
if (arr[i] < minN)minN = arr[i];
}
if (maxN == minN)return 0;
bool *harsh=new bool[n]{0};
int*mins=new int[n];
int *maxs=new int[n];
double gap=double(maxN-minN)/(n-1);//im double为了让分桶更加均匀!!!
for (int i = 0; i < n; i++)
{
int indix=int((arr[i]-minN)/gap);//im 分桶均匀的情况下让下标成为整数
if (harsh[indix])
{
mins[indix]=min(mins[indix],arr[i]);
maxs[indix]=max(maxs[indix],arr[i]);
}
else
{
mins[indix]=maxs[indix]=arr[i];
harsh[indix]=1;
}
}
int lastMax=maxs[0];
for (int i = 1; i < n; i++)
{
if(harsh[i])
{
maxGap=max(maxGap,mins[i]-lastMax);
lastMax=maxs[i];
}
}
delete[]maxs;
delete[]mins;
delete []harsh;
return maxGap;
}
int main() {
cin >> n >> seed;
int* arr = new int[n];
for (int i = 0; i < n; ++i)
arr[i] = rand32();
cout << maxGap(arr) << endl;
delete[]arr;
//system(“pause”);
return 0;
}