从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)
代码如下:
#include <iostream>
#include <fstream>
using namespace std;
int find(int* arr, int len, int n){
int left = 0, right = len, mid = (left+right)/2;
while (left <= right){
if(n > arr[mid])
left = mid + 1;
else if(n < arr[mid])
right = mid - 1;
else
return mid;
mid = (left + right)/2;
}
return left;
}
int main(int argc, char* argv[])
{
ifstream m_cin("testLIS.txt");
int n, i, j, len;
// ltor左到右的意思
int a[100], c[100], ltor[100], rtol[100];
while(m_cin >> n){
for(i = 0; i < n; i++){
m_cin >> a[i];
}
// 从左到右处理输入数组
c[0] = a[0];
len = 0;
for(i = 0; i < n; i++){
j = find(c, len, a[i]);
c[j] = a[i];
if(j > len)
len = j;
ltor[i] = len+1;
}
// 从右到左处理输入数组
c[0] = a[n-1];
len = 0;
for(i = n-1; i >= 0; i--){
j = find(c, len, a[i]);
c[j] = a[i];
if(j > len)
len = j;
rtol[i] = len+1;
}
// 打印结果
int max = 0;
int t;
for(int i = 0; i < n; i++){
if(ltor[i] + rtol[i] > max){
max = ltor[i] + rtol[i];
t = i;
}
}
cout << "当i为" << t << "时";
cout << "最少筛除的元素个数:" << n+1-max << endl;
}
return 0;
}