标签:最大 min int max 间隙 blockNumber 问题 num double
简介
采用鸽笼原理;可以达到O(1);
code
#include<stdio.h>
#include <iostream>
#include <vector>
using namespace std;
typedef struct BLOCK {
int blockNumber;
double min;
double max;
BLOCK(int _blockNumber=0, double _min=1000, double _max=-1000) {
min = _min;
max = _max;
blockNumber = _blockNumber;
}
};
int main() {
int n;
cin >> n;
vector<double> num(n);
double min = 1000; double max = -1000;
for (int i = 0; i < n; i++) {
cin >> num[i];
if (num[i] > max) {
max = num[i];
}
if (num[i] < min) {
min = num[i];
}
}
vector<BLOCK> b(n - 1);
double gap = (max - min) / (n - 1);
//只选择去掉最大值进行 投球
for (int i = 0; i < n; i++) {
if (num[i] == max ) {
continue;
}
int index = (n - 1)*(num[i] - min) / (max - min);
b[index].blockNumber++;
if (b[index].max < num[i]) {
b[index].max = num[i];
}
if (b[index].min > num[i]) {
b[index].min = num[i];
}
}
// max分开处理
b[n - 2].blockNumber++;
if (b[n - 2].max < max) {
b[n - 2].max = max;
}
if (b[n - 2].min > max) {
b[n - 2].min = max;
}
double maxGap = 0;
for (int i = 0; i < n - 2; i++) {
if (b[i].max - b[i].min > maxGap) {
maxGap = b[i].max - b[i].min;
}
double lastMax = b[i].max;
while (b[i + 1].blockNumber == 0) {
if (i + 1 == n - 1) {
break;
}
i++;
}
if (b[i+1].min - lastMax > maxGap) {
maxGap = b[i+1].min - lastMax;
}
}
cout << maxGap << std::endl;
system("pause");
return 0;
}
测试样本
5 2.3 3.1 7.5 1.5 6.3
输出
3.2
标签:最大,min,int,max,间隙,blockNumber,问题,num,double 来源: https://www.cnblogs.com/eat-too-much/p/12100474.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。