- 【例9.4】拦截导弹(Noip1999)
拦截导弹 🆘求救🆘 WA 0 测试样例+自测全对
- 2025-3-28 13:45:48 @
WA 0 测试样例+自测全对
思路死路
第一问
求最长不上升子序列,我直接就是一个数组反转🤓👆然后求上升子序列,这样就可以直接使用 #A1281. 最长上升子序列 的代码了
第二问
因为求有多少个最长不上升子序列,所以我直接把已经被算的数从a数组里清空(clean函数),然后反复进行算a数组里的最长不上升子序列 从a数组里清空已经被算的数
,在这个过程中循环了几次那第二问就是几
🤓👆🖥 → 🤔💭 → 🤡❌ → 💀💩
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int lis[N], a[N], n, ans1, ans2 = 1, iii;
bool check()
{
for (int i = 1; i <= n; i++)
if (a[i])
return false;
return true;
}
void clean()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (lis[i] == a[j])
{
lis[i] = a[j] = 0;
break;
}
}
void ppp()
{
for (int i = 0; i <= 15; i++)
cout << lis[i] << " ";
cout << endl;
}
int a1()
{
int l = 1;
for (int i = 1; i <= n; i++)
{
int ptr = lower_bound(lis, lis + l, a[i]) - lis;
// cout << ptr << " " << a[i] << " " << a[ptr] << endl;
lis[ptr] = a[i];
if (ptr == l)
l++;
// ppp();
// cout << endl;
}
return l;
}
int main()
{
while (cin >> a[n++]) {/*empty*/}
for (int i = 0; i < n / 2; i++)
swap(a[n - i - 1], a[i]);
// ppp();
ans1 = a1();
clean();
while (!check())
{
ans2++;
a1();
clean();
}
cout << ans1 - 1 << " " << ans2;
return 0;
}
8 comments
-
2025-3-29 0:13:02@
//90 103 99 83 102 70 86 70 99 71
//5 3
//89 126 85 103 101 86 86 98 96 99 89 81 101 92 79 77 82 97 83 100 78 72 79 97 71 80 98 89 69 74
//12 6
洛谷上的测试用例,好好想想吧
👍 2 -
2025-3-29 0:10:12@
第二问思路没看懂在讲什么,但这tm只是一个很简单的求最长上升子序列的长度(不懂看这里)这才是可以直接复用#A1281. 最长上升子序列代码的地方
👍 1 -
2025-3-29 0:05:11@
纯肺雾懒得喷,我只看了一点 第一眼看见第一问的思路就笑出来了,你都能想出复用那个代码为什么为什么不能去想改判断条件
最长上升是前<后,那最长不上升不就是前>=后吗,你交换个🥚的数组啊 这题要是求最长下降也就算了,但它是最长不上升啊,=的情况被你吃了吗
👍 2 -
2025-3-28 15:53:48@
感觉有点抽象,打回去出几个测试样例再问😡
1不上升是可以有等号的,你反着遍历那也是不下降📉
2你这个想法也可以,但是之后要想明白最小覆盖链数=最大反链长
-
2025-3-28 14:04:36@
去你MarkDown
👍 2 -
2025-3-28 14:02:42@
石山代码滞销了
帮帮我
-
2025-3-28 14:00:30@
不会有人帮你调代码的!
🤡 3
- 1
Information
- ID
- 745
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 233
- Accepted
- 43
- Uploaded By