diff --git a/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.cpp b/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.cpp index bcda424..8651e3d 100644 --- a/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.cpp +++ b/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.cpp @@ -1,12 +1,69 @@ #include using namespace std; +const int INF = 0x3f3f3f3f; const int N = 110; double a[N]; +int n; +int f1[N], f2[N]; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; // 以每棵树为保留的,并且是最高的那棵树,分别求出最长上升序列长度x 和 最长下降序列长度y, x+y-1就是最终保留的整体序列长度, // 去掉的数量就是 n-(x+y-1)的值。然后求min() // 需要注意的是默认值设置为-1,比如 5 4 3 2 1 ,我们取哪棵为最高点都行不通,不存在左侧上侧到峰值的情况,右侧即使符合也不行的。 + + // 求最长上升 + for (int i = 1; i <= n; i++) { + f1[i] = 1; + for (int j = 1; j < i; j++) + if (a[i] > a[j]) f1[i] = max(f1[i], f1[j] + 1); + } + // 求最长下降 + for (int i = n; i >= 1; i--) { + f2[i] = 1; + for (int j = n; j > i; j--) + if (a[i] > a[j]) f2[i] = max(f2[i], f2[j] + 1); + } + + // // 输出最长上升 + // for (int i = 1; i <= n; i++) cout << f1[i] << " "; + // cout << endl; + + // // 输出最长下降 + // for (int i = 1; i <= n; i++) cout << f2[i] << " "; + // cout << endl; + + bool flag = true; + for (int i = 1; i <= n; i++) + if (f1[i] != 1) { + flag = false; + break; + } + + if (flag) { + cout << -1 << endl; + exit(0); + } + + flag = true; + for (int i = 1; i <= n; i++) + if (f2[i] != 1) { + flag = false; + break; + } + + if (flag) { + cout << -1 << endl; + exit(0); + } + + int mi = -1; + for (int i = 1; i <= n; i++) { + int tmp = f1[i] + f2[i]; + mi = max(mi, tmp); + } + + cout << n - mi + 1 << endl; + return 0; } \ No newline at end of file diff --git a/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.in b/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.in new file mode 100644 index 0000000..744f653 --- /dev/null +++ b/TangDou/LanQiaoBei/LanQiao14STEMA202301/BC5.in @@ -0,0 +1,2 @@ +10 +1.0 2.3 1.2 1.7 1.1 2.0 1.8 1.8 1.2 1.9 \ No newline at end of file