问题描述:
沙滩按照线型摆放着n个大小不一的球形石头,已知第i个石头的半径为ri,且不存在两个石头有相同的半径。为了使石头的摆放更加美观,现要求摆放的石头的半径从左往右依次递增。因此,需要对一些石头进行移动,每次操作可以选择一个石头,并把它放在剩下n−1个石头在最左边或最右边。问最少需要操作多少次才能将这n个石头的半径变成升序?
问题解析:
这是一个排序问题,且每一次操作只能将当前石头放到最左端或者最右端,使用c++的vector存储序列,保持原序列中最大递增1的子序列不变,移动其他石头。那么只需求出最大递增1的子序列长度,再用总长度减去子序列长度,即为需移动数目。
直接上代码:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int>array(n, 0);
int m;
for (int i = 0; i < n; i++)
cin >> array[i];
int max = 1;
for (int i = 0; i < n; i++) {
int k = array[i];
int temp = 1;
for (int j = i + 1; j < n; j++) {
if (k + 1 == array[j]) {
temp++;
k = array[j];
}
}
if (temp > max)
max = temp;
}
cout << n - max << endl;
return 0;
}